在方法定义中放在方法名后面时,equal('=')符号会做什么?

我在截屏中看到了这一点,只是想知道在这种情况下“=”符号的作用。

def express_token=(token) ... end 

我会明白,如果是这样的事情 –

 def express_token(token = nil) 

上面的(第二个代码片段)意味着将nil设置为令牌参数的默认值。 但是,在第一个代码片段中,“=”在方括号之外。

提前致谢。

该片段定义了虚拟属性 (或“setter”方法),以便“express_token”看起来像属性,即使它只是方法的名称。 例如:

 class Foo def foo=(x) puts "OK: x=#{x}" end end f = Foo.new f.foo = 123 # => 123 # OK: x=123 

请注意,对象“f”没有名为“foo”的属性或实例variables(也不需要一个),所以“foo =”方法只允许一个类似于赋值的方法调用的语法糖。 还要注意,这样的setter方法总是返回它们的参数,而不pipe任何return语句或最终值。

如果你正在定义一个顶级的setter方法,例如,在“irb”中,那么这个行为可能会有点混乱,因为隐式添加了Object类的方法。 例如:

 def bar=(y) puts "OK: y=#{y}" end bar = 123 # => 123, sets the variable "bar". bar # => 123 Object.new.bar = 123 # => 123, calls our method # OK: y=123 Object.public_methods.grep /bar/ # => ["bar="] 

这些方法可以让你更加间接地设置实例variables:假设你有一个Person

 class Person < ActiveRecord::Base attr_accessible :first_name, :last_name def full_name [@first_name, @last_name].join end def full_name=(name) @first_name, @last_name = name.split(" ") end end 

那么你可以做这样的事情:

 p = Person.new p.full_name = "John Doe" p.first_name # => "John" p.last_name # => "Doe" p.full_name # => "John Doe" 

它实际上是函数名称的一部分。 所以它是一个setter,如果你需要与getter和setter的默认值相分离的function。

我们来看看下面的例子:

 class NewDog def initialize(breed) @breed = breed end # create reader only attr_reader :breed, :name # setter method def set_name(nm) @name = nm end end nd = NewDog.new('Doberman') nd.set_name('Benzy') puts nd.name 

如果你重构这个setter方法:

 def name=(nm) @name = nm end 

其他程序员知道name =方法的行为就像一个setter方法。 同样如@maerics所示,它的行为就像一个虚拟属性。

结果如下所示:

 class NewDog def initialize(breed) @breed = breed end # create reader only attr_reader :breed, :name # setter method def name=(nm) @name = nm end end nd = NewDog.new('Doberman') nd.name = 'Benzy' puts nd.name