为了更好地理解Ruby,我决定重新创建attr_accessor方法。成功地。我现在明白它是如何工作的,除了关于Ruby的语法糖的一个细节。这是我创建的attr_accessor方法:
def attr_accessor(*attributes)
attributes.each do |a|
# Create a setter method (obj.name=)
setter = Proc.new do |val|
instance_variable_set("@#{a}", val)
end
# Create a getter method (obj.name)
getter = Proc.new do
instance_variable_get("@#{a}")
end
self.class.send(:define_method, "#{a}=", setter)
self.class.send(:define_method, "#{a}", getter)
end
end
我看到它的方式,我刚刚定义了两个方法,obj.name
作为getter,obj.name=
作为setter。但是当我在IRB中执行代码并调用obj.name = "A string"
时它仍然有效,即使我定义了没有空格的方法!
我知道这只是定义Ruby的魔力的一部分,但究竟是什么让它起作用?
答案 0 :(得分:2)
当ruby解释器看到obj.name = "A string
时,它会忽略name
和=
之间的空格,并在name=
上查找名为obj
的方法。
答案 1 :(得分:-1)
没关系,'字符串'是一个非常好的消息名称,只需尝试
obj.send "A string" # ^_^
您甚至可以使用数字:
o = Object.new
o.define_singleton_method "555" do "kokot" end
o.send "555"