在一个简单的示例/练习中获取Ruby语法错误
我是ruby的新手。下面是我的代码,我试图找到一个值为true的值,并将其放入在一个简单的示例/练习中获取Ruby语法错误,ruby,Ruby,我是ruby的新手。下面是我的代码,我试图找到一个值为true的值,并将其放入值中。但是得到了错误 possible_values = [ 'ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR' ] options = { "environment"=>"dev", "status"=>
值中。但是得到了错误
possible_values =
[
'ABC',
'DEF',
'GHI',
'JKL',
'MNO',
'PQR'
]
options = {
"environment"=>"dev",
"status"=>"valid",
"abc"=>true,
"def"=>true,
"ghi"=>false,
"jkl"=>false
}
options['values'] = []
possible_values.each do |val|
options['values'] << val if options[val.downcase]
options.delete("val")
end
puts "values: #{options['values'}"
三个错误:
您的put
行缺少]
:
放置“值:{options['values'}”
#^应该在这里
您希望在处理后删除选项
键,但总是删除“val”
:
选项。删除(“val”)
#^^额外的引号使其成为“val”字符串
同样,您希望在处理后删除选项
键。可能的\u值
都是大写的,如果没有小写
,删除时将与选项
中的对应键不匹配。将#2和#3放在一起,您需要的是:选项。删除(val.downcase)
修复所有这三个选项后,以下是选项的内容:
{“环境”=>“开发”、“状态”=>“有效”、“值”=>[“ABC”、“定义”]}
这似乎是您想要的我知道您希望变异(修改)选项
,而不是返回单独的散列,保持选项
不变
我倾向于编写如下代码,部分是为了方便在计算了true\u键之后测试true\u键
和选项
(如下)
true_keys = options.keys.each_with_object([]) do |k,arr|
case options[k]
when true
arr << k.upcase
options.delete(k)
when false
options.delete(k)
end
end
#=> ["ABC", "DEF"]
注意,我们不能写
true_keys = options.each_key.each_with_object([]) do |k,arr|...
或
因为这会在交互过程中删除选项
的元素,所以在迭代选项.keys
时,这不是问题
还有一步:
options.tap { |h| h['values'] = true_keys & possible_values }
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
看
只是检查一下:
options
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
你也可以写
options.update('values'=>true_keys & possible_values)
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
请参阅(也称为“合并”
)
如果选项
和可能的_值
较大,则作为初始步骤将可能的_值
转换为集合是明智的,因为集合查找比数组查找快得多,后者需要线性搜索。这只会影响点击
(或更新
)操作
require 'set'
possible_values_set = possible_values.to_set
#=> #<Set: {"ABC", "DEF", "GHI", "JKL", "MNO", "PQR"}>
tap
表达式将变为:
options.tap do |h|
h['values'] = true_keys.select { |k| possible_values_set.include?(k) }
end
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
我认为你的插值是关闭的。你缺少了一个右结束括号?你的看跌期权不应该是这样的:看跌期权“值:{options['values']}”
如果选项
包含“xyx”=>true
,你想要什么=>false
?我无法重现您的问题。我甚至无法运行您的代码,我在解析时得到一个SyntaxError
。似乎您发布了错误的代码,因为您发布的代码不可能产生您发布的错误。请提供一个能够准确重现您所遇到的实际问题的示例。所有这些都无法修复OP的问题lem“无法将字符串转换为整数(TypeError)”。事实上,OP的代码首先不可能导致该错误!(实际上,OP的代码根本不会导致运行时错误,因为它在语法上无效,因此永远无法运行。)因此,很明显,问题出在OP没有向我们展示的代码中。初学者提出错误的问题是很常见的。如果你帮助并修复了这个问题,它会更有建设性。OP发布了错误的代码。问题中的代码不可能产生错误。甚至忽略代码中的语法错误。有人支持吗如果产生错误的代码丢失,是否提出修复错误?
options.update('values'=>true_keys & possible_values)
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}
require 'set'
possible_values_set = possible_values.to_set
#=> #<Set: {"ABC", "DEF", "GHI", "JKL", "MNO", "PQR"}>
true_keys
#=> ["ABC", "DEF"]
options.tap do |h|
h['values'] = true_keys.select { |k| possible_values_set.include?(k) }
end
#=> {"environment"=>"dev", "status"=>"valid", "values"=>["ABC", "DEF"]}