2

有谁知道如何将方法称为字符串?例如:

case @setting.truck_identification
when "Make"
  t.make
when "VIN"
  t.VIN
when "Model"
  t.model
when "Registration"
  t.registration

.to_sym似乎不起作用。

4

4 回答 4

5

使用.send

t.send @setting.truck_identification.downcase

vin应该是小写的它才能工作)

于 2012-12-10T22:35:31.807 回答
2

您将要使用Object#send,但您需要使用正确的大小写来调用它。例如:

[1,2,3].send('length')
=> 3

编辑:此外,虽然我会犹豫推荐它,因为这似乎是会导致意外错误的不良做法,但您可以通过搜索对象支持的方法列表来处理不同的大小写。

method = [1,2,3].methods.grep(/LENGth/i).first
[1,2,3].send(method) if method
=> 3

我们使用不区分大小写的正则表达式对所有方法进行 grep,然后将第一个返回的符号发送到对象(如果找到)。

于 2012-12-10T22:36:01.233 回答
1

您可以使用Object#sendmethod 将方法名称作为字符串传递。例如:

t.send(@setting.truck_identification)

您可能需要使用String#downcase方法规范化 truck_identification。

于 2012-12-10T22:38:18.083 回答
1

遍历这些方法并不是最干净的方法。只需使用#respond_to?()

method = @setting.truck_identification.downcase
if t.respond_to?(method)
    t.send(method)
end
于 2012-12-28T15:54:37.243 回答