【发布时间】: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
我正在关注 Rails 3 in Action 这本书,它正在讨论模型中的覆盖 to_s。代码如下:
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道在 Ruby 中,您可以在 "#{value}" 的双引号内显示一个值,但是双问号是怎么回事?
【问题讨论】:
标签: ruby ternary-operator
不要把它看成一个双问号,第一个问号是方法名的一部分(Ruby 允许方法名以“!”、“?”、“=”、“[]”等结尾)。由于 admin 是一个布尔值 ActiveRecord 添加一个管理员?如果用户是管理员则返回 true,否则返回 false。
另一个问号与冒号(:)一起使用,您可以看到它:
condition ? statement_1 : statement_2
如果条件为真,则执行第一条语句,否则执行第二条。
所以把这两件事放在一起,你就有了一个字符串连接,在括号之间添加了“Admin”或“User”这个词。
【讨论】:
实际上是管理员?是一个返回布尔值(真或假)的函数(可能在控制器/辅助方法或模型中的某处定义),下一个问号就像一个 if 条件
if admin? == true
"Admin"
else
"User"
":" 前的第一部分为真,其他为假
【讨论】:
第一个问号是rails中的属性查询方法。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods
(前提是您没有覆盖/重新定义该方法)
这是查看该属性是否存在的简写方法。
【讨论】:
它是string interpolation。 "#{email} (#{admin? ? "Admin" : "User"})" 相当于
email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
那是
email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
由于用引号括起来,在这种情况下Admin 和User 被用作字符串而不是常量。
【讨论】:
condition ? true_result : false_result 语法称为ternary operator 顺便说一句。您可以在大多数语言中找到它作为 if ... then ... else 的简写形式
这个函数返回一个带有电子邮件的字符串,无论他们是管理员还是用户... 即
user_1 = {:email => "test@email.com", :admin => true}
所以打电话
user_1.to_s
将返回字符串
"test@email.com Admin"
【讨论】: