在Ruby方法定义中等号

时间:2017-12-27 15:52:05

标签: ruby

我遇到了以下方法定义,并希望了解第一个和第二个定义之间的区别。

第一个在定义中没有等号:

 def name
   display_name(:name)
 end

这一秒有等号:

 def name=(new_name)
   if! self[:real_name]
     self[:real_name] = new_name
     gera_name_exhibition
   else
     if new_name.is_a? Hash
       self[:name] = new_name.sort.map {| b | b [1]} .join ('')
     else
       self[:name] = new_name
     end
   end
 end

1 个答案:

答案 0 :(得分:1)

第一个是声明:name变量的getter。第二个是声明:name变量的setter。此外还有其他行为。

以下是一个例子:

class GSExample
  def name
    @name
  end

  def name=(val)
    @name = val
  end
end

e = GSExample.new
puts e.name
# => nil

e.name = 'dave'
puts e.name
# => dave

上面你可以看到@name是一个实例变量,用作方法name的getter和方法name=的setter。等号是setter的ruby惯例(我们很容易不会做一个setter,但那将是不好的做法。)

通常是getters& setter(或访问器)使用attr_readerattr_writerattr_accessor完成,如果它们很简单的话。在你的代码中,他们并非如此,他们已经定制了自定义。您可以在此处阅读更多答案:https://stackoverflow.com/a/4371458/33226