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

Posted

技术标签:

【中文标题】你如何在 Ruby 中阅读这个三元条件?【英文标题】:How do you read this ternary condition in Ruby? 【发布时间】:2012-03-31 13:31:48 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

一种(稍微)不那么令人困惑的写法是:

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 position,in 1.9 it returns a single-character string。在这里使用?, 可以避免担心Ruby 1.8 和1.9 之间String#[] 的差异。

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

【讨论】:

谢谢@AndrewMarshall,如果是match == ( ?, ) ? match : "some string" 会有所帮助吗?或者这意味着别的什么? @IsmailTabtabai 那是一样的。每当我做三元语句时,我通常将整个条件语句括在括号中以明确它在哪里,但这只是风格。字符文字可能是 Ruby 中鲜为人知的语法结构之一,当您不知道它是什么时(尤其是与其他 ?s 配对时)可能会非常混乱。 意思是一样的。那么 match[0] == ?, ?匹配:“一些字符串”

以上是关于你如何在 Ruby 中阅读这个三元条件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给angularjs中的三元条件?

如何在颤振小部件中使用条件语句/三元

erb中的Ruby三元运算符?

你如何基于目标三元组有条件地编译?

如何让这个 Javascript 字谜算法在 Ruby 中工作?

这个三元条件表达式是如何执行的?