如果声明检查不在ruby中工作

时间:2016-05-29 00:16:48

标签: ruby string if-statement split

我有以下代码,但是当我运行它时,IF语句中的代码永远不会被执行。

我不明白为什么IF语句永远不会被执行,尽管变量ckey的值与下面粗体输出中显示的相同。

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

3 个答案:

答案 0 :(得分:2)

这是因为keysymbol,而不是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 哈希仅用于提供与字符的比较,因此将密钥声明为将要使用的类型才有意义。

此特定程序不会受到动态转换的显着影响,但如果您习惯于发现并避免不必要的转换,则可以提高代码的整体质量。早期开发良好的编码实践,从长远来看,您将成为一名更好的开发人员。