我遇到了以下方法定义,并希望了解第一个和第二个定义之间的区别。
第一个在定义中没有等号:
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
答案 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_reader
,attr_writer
或attr_accessor
完成,如果它们很简单的话。在你的代码中,他们并非如此,他们已经定制了自定义。您可以在此处阅读更多答案:https://stackoverflow.com/a/4371458/33226