谁能解释一下“def name”和“def name =()”的代码片段? 我不明白为什么会定义2次。
class Bird < Animal
def initialize(name, length)
@name
@length
end
def name
@name
end
def name=(new_name)
@name = new_name
end
end
答案 0 :(得分:1)
一个返回一个值,一个设置一个值。看一下方法体。
def name
@name # return @name
end
def name=(new_name)
@name = new_name # set @name to your argument
end
此外,您的初始化方法不执行任何操作。我假设您要将这些变量设置为您正在使用的参数。
def initialize(name, length)
@name, @length = name, length
end
答案 1 :(得分:1)
这些是getter和setter方法
bird = Bird.new("pigeon", length)
=> #<Bird:0x007f93e9b41278>
bird.name
=> "pigeon"
bird.name = 'seagull'
=> "seagull"
bird.name
=> "seagull"
你在课堂上定义的两种方法都是在这里调用的 - 对
的调用bird.name = 'seagull'
实际上是方法调用的语法糖
bird.name=('seagull')
当然,编写这些方法最“红宝石”的方法是调用attr_accessor:
class Bird < Animal
attr_accessor :name
def initialize(name, length)
@name = name
@length = length
end
end
这将为您提供name属性
的getter和setter方法答案 2 :(得分:0)
我不明白为什么会定义2次。
def name
从@name
和def name=
读取值,将值写入@name
。
以下是 reader (attr_reader)方法
def name; @name; end # shortcut is attr_reader :name
以下是 writer (attr_writer)方法
def name=(new_name) ; @name = new_name ; end # shortcut is attr_writer :name
非常好的文档What is an accessor?
答案 3 :(得分:0)
这些方法被称为“getters”和“setter”,因为(不出所料),它们“得到”或“设置”变量。 您还可以将一个视为“命令”,它将对数据进行一些更改,另一个作为“查询”,它只会报告一个值(这是一个有用的区别,在您设计时要记住这一点自己的方法)。
Ruby包含三个为您定义这些getter和setter的类方法:attr_reader
定义getter,attr_writer
定义setter,attr_accessor
定义两者。
您可以直接与实例变量进行交互,但在大多数情况下,代码更容易更改,并且在您使用方法访问数据时更容易理解,而不是弄乱数据本身。