我正在关注Rails 3 in Action一书,它正在讨论模型中的覆盖to_s
。代码如下:
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道在Ruby中你可以在"#{value}"
的双引号内显示一个值,但是双重问号是什么?
答案 0 :(得分:7)
这是string interpolation。 "#{email} (#{admin? ? "Admin" : "User"})"
相当于
email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
即
email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
由于括在引号中,在此上下文中Admin
和User
用作字符串而不是常量。
答案 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"