ruby!! 操作员(a / k / a双重砰击)

可能重复:
什么! 意思是ruby?

嗨,

我是Ruby的新手,无法find任何描述什么“!!” 手段。

这是一个例子:

def signed_in? !!current_user end 

如果这是一个双重否定,为什么不说:

 def signed_in? current_user end 

请帮忙。

在大多数编程语言中,包括Ruby,! 将返回与操作数的布尔值相反的值。 所以,当你把两个感叹号链接在一起,它将值转换为布尔值。

在Ruby(以及许多其他语言)中,有许多值在布尔上下文中评估为true ,而less数评估为false。 在Ruby中, 评估为false的唯一两件事是false (本身)和nil

如果否定某件事情,则强制布尔上下文。 当然,它也否定了它。 如果双重否定,它会强制布尔上下文,但会返回正确的布尔值。

例如:

 "hello" #-> this is a string; it is not in a boolean context !"hello" #-> this is a string that is forced into a boolean # context (true), and then negated (false) !!"hello" #-> this is a string that is forced into a boolean # context (true), and then negated (false), and then # negated again (true) !!nil #-> this is a false-y value that is forced into a boolean # context (false), and then negated (true), and then # negated again (false) 

在你的例子中, signed_in? 方法应该返回一个布尔值(按照惯例由?字符表示)。 它用来决定这个值的内部逻辑是检查current_uservariables是否被设置。 如果已设置,则将在布尔上下文中评估为true 。 如果不是,则将评估为错误。 双重否定强制返回值是一个布尔值。

!! 只是! (布尔否定运算符)写两次。 它会否定论证,否定否定。 这是有用的,因为你可以用它来从任何值获得布尔值。 第一! 会将参数转换为布尔值,例如,如果nil或为false ,则为false ,否则为false 。 第二个会再次否定,这样你就可以得到参数的布尔值,对于nil或者为false ,对于其他所有事情都是true的。

在Ruby中,您可以在if语句中使用任何值,例如, if current_user将在当前用户不nil 。 大多数情况下这是很好的,因为这样可以节省我们input明确的testing(比如if !current_user.nil? ,它至less有六个字符)。 但是有时候,如果你返回一个对象,当这个方法暗示它返回一个布尔值的时候,它可能会让你感到困惑。 名字以?结尾的方法? 应该返回真实或错误的价值,即他们返回的东西,将评估为truefalse 。 但是,如果signed_in?会变得非常麻烦signed_in? 返回一个用户对象。 例如,如果你想debugging一些使用signed_in?代码signed_in? 不起作用,当用户对象出现truefalse地方时,您可能会感到非常困惑。 在这种情况下,添加!!return之前,因为这保证了truefalse价值将被返还为truefalse

正如你正确的理解这是一个双重否定的使用! 运营商。 这就是说,虽然它可以作为一个简短的方法来检查一个variables是否可以为零,IMO 太简单了 。 看看这个和这个职位。 请注意,在Ruby中,对nil进行testing将被评估为false。