English 中文(简体)
Ruby方法名称中的变量
原标题:
  • 时间:2008-11-19 00:52:50
  •  标签:

我有以下代码:

for attribute in site.device_attributes
  device.attribute
end

我希望代码用"属性"的值替换方法名称。

我已尝试device."#{attribute}"和各种排列组合。

这完全不可能吗?我有什么遗漏吗?

我考虑过重写 method_missing,但是我无法想象这实际上如何帮助我,因为我的问题是我需要调用一个“未知”的方法。

最佳回答

你可以使用 #send 方法通过方法名调用对象的方法:

object.send(:foo) # same as object.foo

您可以传递参数给被调用的方法:

object.send(:foo, 1, "bar", 1.23) # same as object.foo(1, "bar", 1.23)

因此,如果您在变量“attribute”中具有属性名称,则可以使用该变量读取对象的属性。

object.send(attribute.to_sym)

请翻译以下内容,并附加属性值: And write attribute's value with. 并附加属性值。

object.send("#{attribute}=".to_sym, value)

在Ruby 1.8.6中,#send方法可以执行任何对象的方法,而不考虑其可见性(例如,您可以调用私有方法)。这在将来的Ruby版本中可能会更改,因此您不应该依赖它。要执行私有方法,请使用#instance_eval:

object.instance_eval {
  # code as block, can reference variables in current scope
}

# or

object.instance_eval <<-CODE
  # code as string, can generate any code text
CODE

Update

您可以使用public_send来调用与可见性规则相关的方法。

object.public_send :public_foo # ok
object.public_send :private_bar # exception
问题回答

“send”方法应该做你想要的事情:

object = "upcase me!"
method = "upcase"
object.send(method.to_sym) # => "UPCASE ME!"

Matt和Maxim都是正确的,但是忽略了一个可能帮助你理解 #send 语法的细节:Ruby中,调用方法实际上是发送消息。 Softies on Rails提供了一个相对简单的解释

你也可以做。

device.instance_eval(attribute)




相关问题
热门标签