有人可以向我解释以下代码吗?

时间:2012-03-26 05:37:19

标签: ruby ternary-operator

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

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

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

5 个答案:

答案 0 :(得分:7)

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

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

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

由于括在引号中,在此上下文中AdminUser用作字符串而不是常量。

答案 1 :(得分:2)

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

(如果您没有覆盖/重新定义该方法)

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

答案 2 :(得分:2)

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

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

“:”之前的第一部分是真实案例而另一部分是虚假案件

答案 3 :(得分:2)

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

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

condition ? statement_1 : statement_2

如果condition为true,则执行第一个语句,否则执行第二个语句。

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

答案 4 :(得分:1)

此函数返回一个包含电子邮件的字符串,无论是管理员还是用户...... 即

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

所以打电话

user_1.to_s 

将返回字符串

"test@email.com Admin"