我正在跟随Rails 3 in Action书,它正在讨论在模型中覆盖to_s
。代码如下:有人可以向我解释下面的代码吗?
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道,在Ruby中,你可以通过"#{value}"
显示双引号内的值,但什么是了双问号?
我正在跟随Rails 3 in Action书,它正在讨论在模型中覆盖to_s
。代码如下:有人可以向我解释下面的代码吗?
def to_s
"#{email} (#{admin? ? "Admin" : "User"})"
end
我知道,在Ruby中,你可以通过"#{value}"
显示双引号内的值,但什么是了双问号?
这是string interpolation。 "#{email} (#{admin? ? "Admin" : "User"})"
相当于
email.to_s + " (" + (admin? ? "Admin" : "User") + ")"
即
email.to_s + " (" + if admin? then "Admin" else "User" end + ")"
由于被封闭在引号中,在这种情况下Admin
和User
被用作字符串和不为常数的结果。
此功能与电子邮件返回一个字符串,他们是否是管理员或用户... 即
user_1 = {:email => "[email protected]", :admin => true}
因此呼叫
user_1.to_s
将返回字符串
"[email protected] Admin"
第一个问号是rails中的属性查询方法。 http://api.rubyonrails.org/classes/ActiveRecord/Base.html#label-Attribute+query+methods
(提供您未覆盖/重新定义方法)
它是一种速记方法,看看是否能属性存在或不存在。
其他admin?是,返回布尔函数(可能是在控制器/辅助方法或模型的某处定义的)(真或假)和下一个问号就像一个如果条件
if admin? == true
"Admin"
else
"User"
之前第一部分“:”为真情况和其他是为了假的情况
不要把它看作双重问号,第一个问号是方法名称的一部分(Ruby允许方法名以“!”,“?”,“=”结尾,“[]”等)。由于管理员是一个布尔值ActiveRecord添加管理员?如果用户是管理员,则返回true;否则返回false。
另一个问号是用来与冒号(:),你可以看到它像:
condition ? statement_1 : statement_2
如果条件为真时执行的第一条语句,否则第二个它evalueted。
因此,将这两个东西放在一起,并且您有一个字符串连接,在括号之间添加“Admin”或“User”字。
'病情? true_result:false_result'语法被称为[三运算符](http://en.wikipedia.org/wiki/Ternary_operation)btw。你可以找到它的大多数语言作为'if ... then ... else'的简写形式。 – 2012-03-26 08:30:24
谢谢!在继续之前,字符串插值绝对是我要阅读的更多内容。听起来我应该更熟悉它。 – ruevaughn 2012-03-26 20:48:54