我有以下代码,但是当我运行它时,IF语句中的代码永远不会被执行。
我不明白为什么IF语句永远不会被执行,尽管变量c
和key
的值与下面粗体输出中显示的相同。
text = 'cab'
letters = {
'a': 1,
'b': 2,
'c': 3,
}
text.split("").each do |c|
puts c
puts "Text #{c}"
for key, value in letters
puts "Key #{key}, Text #{c}, Value #{value}"
if c == key
puts "hello #{c}"
end
end
end
输出
c Text c Key a, Text c, Value 1 Key b, Text c, Value 2 Key c, Text c, Value 3 a Text a Key a, Text a, Value 1 Key b, Text a, Value 2 Key c, Text a, Value 3 b Text b Key a, Text b, Value 1 Key b, Text b, Value 2 Key c, Text b, Value 3
答案 0 :(得分:2)
这是因为key
是symbol
,而不是string
。如果您想使用字符串作为键,则必须使用'a' => 1
表示法。
或者,您可以在符号上调用.to_s
方法:
if c == key.to_s
答案 1 :(得分:1)
您的key
是符号,请将其更改为字符串:
if c == key.to_s
答案 2 :(得分:1)
您遇到的问题是function minProp(arr, prop){
return arr.sort(function(a,b){
return a[prop] - b[prop];
})[0][prop];
}
items.sort(function(a,b){
var mina = minProp(a.variations,'price');
var minb = minProp(b.variations,'price');
return mina-minb;
});
语句中的比较符属于不同类型,因此条件始终为if
。进行此更改:
false
这将使您的letters = {
'a' => 1,
'b' => 2,
'c' => 3,
}
哈希值由字符串而不是符号键入。 hashrocket letters
用于将键与哈希值相关联,而不将键转换为符号。将哈希键设为字符串将允许字符串哈希键与字符串字符正确比较,这将使其工作。
您也可以按照其他答案的建议进行内联转换,如下所示:
=>
但是,每次必须进行检查时,都会产生运行时损失。只需更改哈希键即可使检查工作,这意味着每次需要比较时,您都不必手动将一个对象转换为另一个对象。由于if c == key.to_s
哈希仅用于提供与字符的比较,因此将密钥声明为将要使用的类型才有意义。
此特定程序不会受到动态转换的显着影响,但如果您习惯于发现并避免不必要的转换,则可以提高代码的整体质量。早期开发良好的编码实践,从长远来看,您将成为一名更好的开发人员。