你如何在Ruby中阅读这个三元条件?

时间:2012-03-15 02:00:36

标签: ruby regex multiline ternary-operator

我在某些代码中遇到了三元组,我无法理解条件:

str.split(/',\s*'/).map do |match|
  match[0] == ?, ?
    match : "some string"
end.join

我知道我在某些点分割字符串并将总结果转换为数组,并依次处理数组的每个元素。除此之外,我不知道发生了什么。

1 个答案:

答案 0 :(得分:7)

写一个(稍微)不那么混乱的方式是:

str.split(/',\s*'/).map do |match|
  if match[0] == ?,
    match
  else
    "some string"
  end
end.join

我认为多行三元语句很糟糕,特别是因为if块可以在Ruby中返回。

这里最令人困惑的可能是?,这是一个字符文字。在Ruby 1.8中,这意味着字符的ASCII值(在本例中为44),在Ruby 1.9中,这只是一个字符串(在本例中为",")。

使用字符文字而不仅仅是","的原因是在Ruby 1.9中更改了对字符串调用[]的返回值。 In 1.8 it returned the ASCII value of the character at that positionin 1.9 it returns a single-character string。在这里使用?,可以避免担心Ruby 1.8和&之间的String#[]之间的差异。 1.9。

最终,条件只是检查match中的第一个字符是否为,,如果是,则保持值相同,否则将其设置为"some string"