0

Who can explain me the code snippets of "def name" and "def name=()"? I don't understand why it is defined 2 times.

class Bird < Animal
  def initialize(name, length)
    @name
    @length
  end

  def name
    @name
  end

  def name=(new_name)
    @name = new_name
  end
end
4

4 回答 4

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
于 2013-07-18T21:07:10.500 回答
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 方法

于 2013-07-18T21:20:52.270 回答
0

我不明白为什么它被定义了 2 次。

def name从 读取值@name并将def name=值写入@name.

下面是一个阅读器(attr_reader)方法

def name; @name; end # shortcut is attr_reader :name

下面是一个作家(attr_writer)方法

def name=(new_name) ;  @name = new_name ; end # shortcut is attr_writer :name

一个很好的文档什么是访问器?

于 2013-07-18T21:04:42.487 回答
0

这些方法被称为“getter”和“setter”,因为(不出所料)它们“获取”或“设置”一个变量。您还可以将一个视为“命令”,它将对数据进行一些更改,将一个视为“查询”,它将仅报告一个值(在设计您的也有自己的方法)。

Ruby 包含三个为您定义这些 getter 和 setter 的类方法:attr_reader定义 getter、attr_writer定义 setter 和attr_accessor定义两者。

您可以直接与实例变量交互,但在大多数情况下,代码更容易更改和推理何时使用方法访问数据而不是弄乱数据本身。

于 2013-07-18T21:09:06.250 回答