Ruby 字符串插值在 1.9.3 中引发语法错误,但在 2.3.1 中没有
Ruby String interpolation throws syntax error in 1.9.3 but not 2.3.1
对于大量代码,提前表示歉意。我担心我可能错过了一些在上下文中显而易见的东西。
def remove_runbook_items(runbook_id, runbook_item_id)
item_id = runbook_item_id.to_s
method = 'POST'
url = @the_endpoint
data = {
invokeDetail: {
process: 'remove_runbook_items',
parameters: {
runbook_id: runbook_id,
runbook_items: {
"#{item_id}": {
cores: options[:cores],
ram: options[:ram],
rank: options[:rank],
wait_time: options[:wait_time]
}
}
}
}
}
data.merge! @common_data
result = send_request(method, url, data.to_json)
result['resultDetail'] # Returns contents of response from REST API server
end
违规行是 "#{item_id}": {
名为 "data" 的文本块被转换为 json,因此我 必须 插入字符串 "item_id" 否则它将从字面上吐出 "item_id" 在结果请求中,而不是 item_id 的内容。其实,如果有一种不用插值就可以获取内容的方法,我很想知道。
所以当我以这种方式插入我的字符串时,它在 Ruby 2.3.1 上工作得很好。但是,当我尝试在使用 Ruby 1.9.3 的机器上 运行 相同的代码时,我在插入如下字符串的任何地方都会遇到一连串的语法错误:
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1122: syntax error, unexpected ':', expecting tASSOC
"#{device_id}": {
^
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1128: syntax error, unexpected '}', expecting keyword_end
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1163: syntax error, unexpected ':', expecting tASSOC
"#{item_id}": {
^
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1169: syntax error, unexpected '}', expecting keyword_end
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1257: syntax error, unexpected ':', expecting tASSOC
"#{item_id}": {
^
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1263: syntax error, unexpected '}', expecting keyword_end (SyntaxError)
有人有什么建议吗?不幸的是,无法在测试机器上升级 ruby 的版本。
问题不在于迭代。
{ symbol: value }
是一种新语法,是{ :symbol => value }
的快捷方式。在它的第一次迭代中,我认为它不支持 { "symbol": value }
自动字符串符号化功能。如果向后兼容性是目标,请使用老式的 { "symbol".to_sym => value }
。
(如果您 知道 您所做的只是转换为 JSON,您甚至可以将其保留为 { "string" => value }
,知道 JSON 不区分字符串和符号;但我认为这是一种代码味道。)
对于大量代码,提前表示歉意。我担心我可能错过了一些在上下文中显而易见的东西。
def remove_runbook_items(runbook_id, runbook_item_id)
item_id = runbook_item_id.to_s
method = 'POST'
url = @the_endpoint
data = {
invokeDetail: {
process: 'remove_runbook_items',
parameters: {
runbook_id: runbook_id,
runbook_items: {
"#{item_id}": {
cores: options[:cores],
ram: options[:ram],
rank: options[:rank],
wait_time: options[:wait_time]
}
}
}
}
}
data.merge! @common_data
result = send_request(method, url, data.to_json)
result['resultDetail'] # Returns contents of response from REST API server
end
违规行是 "#{item_id}": {
名为 "data" 的文本块被转换为 json,因此我 必须 插入字符串 "item_id" 否则它将从字面上吐出 "item_id" 在结果请求中,而不是 item_id 的内容。其实,如果有一种不用插值就可以获取内容的方法,我很想知道。
所以当我以这种方式插入我的字符串时,它在 Ruby 2.3.1 上工作得很好。但是,当我尝试在使用 Ruby 1.9.3 的机器上 运行 相同的代码时,我在插入如下字符串的任何地方都会遇到一连串的语法错误:
/home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1122: syntax error, unexpected ':', expecting tASSOC "#{device_id}": { ^ /home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1128: syntax error, unexpected '}', expecting keyword_end /home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1163: syntax error, unexpected ':', expecting tASSOC "#{item_id}": { ^ /home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1169: syntax error, unexpected '}', expecting keyword_end /home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1257: syntax error, unexpected ':', expecting tASSOC "#{item_id}": { ^ /home/mydir/mydir/mydir/mydir/mydir/restapi_helper.rb:1263: syntax error, unexpected '}', expecting keyword_end (SyntaxError)
有人有什么建议吗?不幸的是,无法在测试机器上升级 ruby 的版本。
问题不在于迭代。
{ symbol: value }
是一种新语法,是{ :symbol => value }
的快捷方式。在它的第一次迭代中,我认为它不支持 { "symbol": value }
自动字符串符号化功能。如果向后兼容性是目标,请使用老式的 { "symbol".to_sym => value }
。
(如果您 知道 您所做的只是转换为 JSON,您甚至可以将其保留为 { "string" => value }
,知道 JSON 不区分字符串和符号;但我认为这是一种代码味道。)