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

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

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

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

这是字符串插值 。 "#{email} (#{admin? ? "Admin" : "User"})"相当于

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

那是

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

作为括在引号中的结果,在此上下文中, AdminUser用作字符串而不是常量。

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

(假设您没有覆盖/重新定义该方法)

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

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

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

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

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

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

 condition ? statement_1 : statement_2 

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

所以把这两个东西放在一起,你有一个字符串连接,在括号之间添加“管理员”或“用户”字样。

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

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

所以电话

 user_1.to_s 

会返回字符串

 "test@email.com Admin"