gpt4 book ai didi

ruby - 在 Ruby 类中定义类方法和属性的正确方法

转载 作者:行者123 更新时间:2023-12-04 09:06:34 28 4
gpt4 key购买 nike

我正在尝试写一个 Person Ruby 中的类,它具有一些方法和属性。以下是我现在如何实现它。

class Person
attr_accessor :name, :gender, :mother

def initialize(name, gender, mother)
@name = name
@gender = gender
@mother = mother
@spouse = nil
end

def add_spouse(spouse)
if spouse
@spouse = spouse
spouse.spouse = self
end
end

def father(self)
return [self.mother.spouse]
end
end
我想访问这样的方法:
m = Person.new('mom', 'Female')
d = Person.new('dad', 'Male')

d.add_spouse(m)

p = Person.new('Jack', 'Male', m)

如果我想获得 fatherp ,然后我想这样得到它: p.father .
那么上面的实现正确吗?
如果我运行代码,我会收到以下错误:
person.rb:18: syntax error, unexpected `self', expecting ')'
def father(self)
person.rb:21: syntax error, unexpected `end', expecting end-of-input
如果我删除 self来自 def father(self) ,然后我收到此错误:
person.rb:14:in `add_spouse': undefined method `spouse=' for #<Person:0x00005570928382d8> (NoMethodError)
我的错误在这里: attr_accessor :spouse .我必须添加它并访问它我必须做 puts(p.father[0].name)有没有更好的方法来实现具有类似其他属性的上述类,如 father , children , brothers ETC?

最佳答案

在 Ruby 中,一切都是对象,几乎所有的东西都不包括 block 等等。Ruby 使用 classes作为 Objects 的定义他们建立了attributesmethods .
您的代码设置 name 的属性, gendermother并有 add_spouse 的方法和 father .因此,父亲被解释为属性和方法的明显混合。从命名约定的角度来看,我们可以重命名该方法 collect_father_relation或类似的东西,它将处理呈现对象的逻辑。
你也不需要显式写return正如您在 father 中所做的那样方法,Ruby 会为你做到这一点。
我会重新配置 father方法如下:

def collect_father_relation
@mother&.spouse
end
您调用 @mother instance_variable,定义实例,只调用 spouse如果 @mothernil 存在(因为它可以是 &. )运算符(operator)。
您还应该准备 initialize nil 的函数被传递的母亲:
def initialize(name, gender, mother = nil)
这将接受一个母亲参数,但也不会引发 ArgumentError如果一个没有通过。
最后,您必须添加 attr_accessor对于 :spouse因为您需要明确引用 spouse对于配偶 Person 对象,因为您在 spouse.spouse = self 中设置关系
其他的建议:
让我们为 add_spouse 创建一个保护子句方法(如上所述)明确解释我们在做什么,而不是模棱两可的 if 语句。
  def add_spouse(spouse)
return if spouse.nil?

@spouse = spouse
spouse.spouse = self
end

关于ruby - 在 Ruby 类中定义类方法和属性的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63428731/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com