【问题标题】:Can someone explain the following code to me?有人可以向我解释以下代码吗?
【发布时间】:2012-04-09 15:52:10
【问题描述】:

我正在关注 Rails 3 in Action 这本书,它正在讨论模型中的覆盖 to_s。代码如下:

def to_s
  "#{email} (#{admin? ? "Admin" : "User"})"
end

我知道在 Ruby 中,您可以在 "#{value}" 的双引号内显示​​一个值,但是双问号是怎么回事?

【问题讨论】:

    标签: ruby ternary-operator


    【解决方案1】:

    不要把它看成一个双问号,第一个问号是方法名的一部分(Ruby 允许方法名以“!”、“?”、“=”、“[]”等结尾)。由于 admin 是一个布尔值 ActiveRecord 添加一个管理员?如果用户是管理员则返回 true,否则返回 false。

    另一个问号与冒号(:)一起使用,您可以看到它:

    condition ? statement_1 : statement_2
    

    如果条件为真,则执行第一条语句,否则执行第二条。

    所以把这两件事放在一起,你就有了一个字符串连接,在括号之间添加了“Admin”或“User”这个词。

    【讨论】:

      【解决方案2】:

      实际上是管理员?是一个返回布尔值(真或假)的函数(可能在控制器/辅助方法或模型中的某处定义),下一个问号就像一个 if 条件

      if admin? == true
       "Admin"
      else
       "User"
      

      ":" 前的第一部分为真,其他为假

      【讨论】:

        【解决方案3】:

        第一个问号是rails中的属性查询方法。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods

        (前提是您没有覆盖/重新定义该方法)

        这是查看该属性是否存在的简写方法。

        【讨论】:

          【解决方案4】:

          它是string interpolation"#{email} (#{admin? ? "Admin" : "User"})" 相当于

          email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
          

          那是

          email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
          

          由于用引号括起来,在这种情况下AdminUser 被用作字符串而不是常量。

          【讨论】:

          • condition ? true_result : false_result 语法称为ternary operator 顺便说一句。您可以在大多数语言中找到它作为 if ... then ... else 的简写形式
          • 谢谢!字符串插值绝对是我在继续之前要阅读的更多内容。听起来我应该更熟悉它。
          【解决方案5】:

          这个函数返回一个带有电子邮件的字符串,无论他们是管理员还是用户... 即

          user_1 = {:email => "test@email.com", :admin => true}
          

          所以打电话

          user_1.to_s 
          

          将返回字符串

          "test@email.com Admin"
          

          【讨论】:

            猜你喜欢
            • 2023-02-08
            • 2023-04-02
            • 1970-01-01
            • 1970-01-01
            • 2011-08-20
            • 1970-01-01
            • 2022-12-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多