Ruby - 转义一个前导变量名称

时间:2014-10-17 19:05:16

标签: ruby

我正在使用create()插入已存在的表中,但某些表字段和变量名以数字开头。目前在Ruby中,当我尝试执行以下操作时,我收到语法错误“意外的tIDENTIFIER” -

foo.each do |x|
 Object.create(
      3pm: x.3pm,
      3pa: x.3pa
    )
end

如果我将其更改为'3pm' => x.3pm,则会在x.3pm部分给出语法错误。

我怎么能逃避这个以使其运作?

1 个答案:

答案 0 :(得分:3)

问题是3pm不是Ruby中的valid identifier。在Ruby中,使用:name语法和方法名称声明的符号文字必须都是有效的标识符。

对于键,您可以通过使用字符串代替,如您发现的那样,或者使用符号文字的:'name'语法来解决这个问题:

foo.each do |x|
 Object.create(
      :'3pm' => x.3pm,
      :'3pa' => x.3pa
    )
end

不幸的是,这仍然存在3pm3pa不是有效方法名称的问题。通常,由于这些名称不是有效的方法名称,因此它们甚至不能成为x上的方法。但在这种情况下,x可能会使用Ruby的define_methodmethod_missing功能来创建或模拟名为3pm的方法的存在(即使这样&# 39; s通常不是Ruby中的有效方法名称。

值得庆幸的是,我们可以通过使用Object#public_send来调用方法来解决这个问题:

foo.each do |x|
 Object.create(
      :'3pm' => x.public_send(:'3pm'),
      :'3pa' => x.public_send(:'3pa')
    )
end

那可以解决你的问题。