读者和作家方法

时间:2013-07-18 21:01:53

标签: ruby class methods

谁能解释一下“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

4 个答案:

答案 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@namedef 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定义两者。

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