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

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

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

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

【问题讨论】:

    标签: ruby regex multiline ternary-operator


    【解决方案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 positionin 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] == ?, ?匹配:“一些字符串”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 2010-12-02
    • 1970-01-01
    • 2011-11-14
    相关资源
    最近更新 更多