2012-03-26 87 views
3

我正在跟随Rails 3 in Action书,它正在讨论在模型中覆盖to_s。代码如下:有人可以向我解释下面的代码吗?

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

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

回答

7

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

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

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

由于被封闭在引号中,在这种情况下AdminUser被用作字符串和不为常数的结果。

+0

'病情? true_result:false_result'语法被称为[三运算符](http://en.wikipedia.org/wiki/Ternary_operation)btw。你可以找到它的大多数语言作为'if ... then ... else'的简写形式。 – 2012-03-26 08:30:24

+0

谢谢!在继续之前,字符串插值绝对是我要阅读的更多内容。听起来我应该更熟悉它。 – ruevaughn 2012-03-26 20:48:54

1

此功能与电子邮件返回一个字符串,他们是否是管理员或用户... 即

user_1 = {:email => "[email protected]", :admin => true} 

因此呼叫

user_1.to_s 

将返回字符串

"[email protected] Admin" 
2

其他admin?是,返回布尔函数(可能是在控制器/辅助方法或模型的某处定义的)(真或假)和下一个问号就像一个如果条件

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

之前第一部分“:”为真情况和其他是为了假的情况

2

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

另一个问号是用来与冒号(:),你可以看到它像:

condition ? statement_1 : statement_2 

如果条件为真时执行的第一条语句,否则第二个它evalueted。

因此,将这两个东西放在一起,并且您有一个字符串连接,在括号之间添加“Admin”或“User”字。

相关问题