我正在使用create()插入已存在的表中,但某些表字段和变量名以数字开头。目前在Ruby中,当我尝试执行以下操作时,我收到语法错误“意外的tIDENTIFIER” -
foo.each do |x|
Object.create(
3pm: x.3pm,
3pa: x.3pa
)
end
如果我将其更改为'3pm' => x.3pm
,则会在x.3pm
部分给出语法错误。
我怎么能逃避这个以使其运作?
答案 0 :(得分:3)
问题是3pm
不是Ruby中的valid identifier。在Ruby中,使用:name
语法和方法名称声明的符号文字必须都是有效的标识符。
对于键,您可以通过使用字符串代替,如您发现的那样,或者使用符号文字的:'name'
语法来解决这个问题:
foo.each do |x|
Object.create(
:'3pm' => x.3pm,
:'3pa' => x.3pa
)
end
不幸的是,这仍然存在3pm
和3pa
不是有效方法名称的问题。通常,由于这些名称不是有效的方法名称,因此它们甚至不能成为x
上的方法。但在这种情况下,x
可能会使用Ruby的define_method
或method_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
那可以解决你的问题。