红宝石-当在方法定义中的方法名称后面加上等号('=')会做什么?

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

def express_token=(token)
...
end

我会明白是否是这样的-

def express_token(token = nil) 

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

提前致谢。

redshift5 asked 2019-10-09T18:19:38Z
4个解决方案
78 votes

该代码段定义了虚拟属性(或“ 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”的属性或实例变量(也不需要它),因此“ foo =“方法只是语法糖,用于允许看起来像赋值的方法调用。 还请注意,无论任何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="]
maerics answered 2019-10-09T18:20:02Z
19 votes

这些方法使您可以以更间接的方式设置实例变量:假设您有一个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"
Alberto Santini answered 2019-10-09T18:20:27Z
3 votes

它实际上是函数名称的一部分。 因此,这是一个设置器,以防万一您需要与默认方法不同的功能来获取和设置器。

Yule answered 2019-10-09T18:20:51Z
2 votes

让我们看下面的例子:

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 
Peter Piper answered 2019-10-09T18:21:34Z
translate from https://stackoverflow.com:/questions/5398919/what-does-the-equal-symbol-do-when-put-after-the-method-name-in-a-method-d