Ruby 方法定义中的等号

Equal sign in Ruby method definition

本问题已经有最佳答案,请猛点这里访问。

我遇到了以下方法定义,想知道第一个和第二个定义的区别。

定义中第一个没有等号:

1
2
3
 def name
   display_name(:name)
 end

这一秒有等号:

1
2
3
4
5
6
7
8
9
10
11
12
 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


第一个是声明 :name 变量的 getter。第二个是为 :name 变量声明一个设置器。那里还有其他行为。

这是一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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,但这是不好的做法。)

通常是吸气剂