Ruby 鲁比!!操作员(a/k/a双重爆炸)
可能重复:Ruby 鲁比!!操作员(a/k/a双重爆炸),ruby,operators,Ruby,Operators,可能重复: 嗨 我是Ruby新手,在任何地方都找不到“!!”的含义的描述 下面是一个例子: def signed_in? !!current_user end 如果这是双重否定,为什么不说: def signed_in? current_user end 请提供帮助。在大多数编程语言中,包括Ruby,将返回与操作数的布尔值相反的值。因此,当您将两个感叹号链接在一起时,它会将值转换为布尔值。在Ruby(和许多其他语言)中,在布尔上下文中有许多值的计算结果为true,少数值的计算结果为
嗨 我是Ruby新手,在任何地方都找不到“!!”的含义的描述 下面是一个例子:
def signed_in?
!!current_user
end
如果这是双重否定,为什么不说:
def signed_in?
current_user
end
请提供帮助。在大多数编程语言中,包括Ruby,
代码>将返回与操作数的布尔值相反的值。因此,当您将两个感叹号链接在一起时,它会将值转换为布尔值。在Ruby(和许多其他语言)中,在布尔上下文中有许多值的计算结果为true
,少数值的计算结果为false。在Ruby中
如果您否定某个内容,则强制使用布尔上下文。当然,它也否定了它。如果双重求反,它将强制布尔上下文,但返回正确的布尔值
例如:
"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?
方法应该返回一个布尔值(由?
字符表示)。它用于确定该值的内部逻辑是通过检查当前用户
变量是否已设置。如果已设置,则在布尔上下文中,它将计算为true
。如果不是,它将评估为false。双反运算强制返回值为布尔值。代码>只是代码>(布尔否定运算符)写入两次。它将否定论点,然后否定否定。它很有用,因为您可以使用它从任何值中获取布尔值。第一个
将参数转换为布尔值,例如true
如果nil
或false
,否则false
。第二个将再次对其求反,这样您就可以得到参数的布尔值,false
表示nil
或false
,true
表示几乎所有其他内容
在Ruby中,您可以在if
语句中使用任何值,例如,如果当前用户不是nil
,则执行if current\u user
。大多数情况下,这很好,因为它可以节省我们键入显式测试的时间(比如if!current_user.nil?
,至少长六个字符)。但有时,如果您返回一个对象,而该方法暗示它返回一个布尔值,那么它可能会非常混乱。名称以?
结尾的方法应返回truthy或falsy值,即它们返回的值将计算为true
或false
。然而,如果signed\u-in?
返回了一个用户对象,它会变得非常混乱。例如,如果您试图调试某些使用signed\u-in?
的代码为什么不起作用,那么当用户对象出现在您期望的true
或false
位置时,您可能会感到非常困惑。在这种情况下,添加因为这保证了truthy或falsy值将作为true
或false
返回,正如您正确理解的,这是的双重否定用法代码>操作员。这就是说,虽然它可以作为检查变量是否为零的一种简捷方法,但在我看来,这太简洁了。看一看并张贴。请注意,在Ruby中,将某些内容测试为零将评估为假。您是否查看了在键入问题标题后提供给您的问题?是的,没有任何内容。事实上,我发现类似的问题解释了我的第二个问题,但我必须通过“双重爆炸”进行搜索,这并不像你想象的那么明显。是的,当标题的重要部分是标点符号时,类似的问题算法很容易被欺骗。请参见和[Ruby中的“!!”符号是什么意思?)()。将来,尝试使用symbolhound.com搜索syntax.so!“力是真的吗!!“”设置为false还是空字符串也为true?!“
是false
,因为唯一的false-y值是false
和nil
。其他一切都是真实的:我编辑了我的答案,使之更加清晰。这是更好的答案,因为它解释了原因。看起来就像你在Java中看到的那种通过在int后面加一个“”将其转换为字符串的黑客行为(顺便说一句,我并不提倡这种做法——我相信这在Java中是不好的做法)。考虑到这在Java中是一种糟糕的做法,我不明白为什么Ruby这样的语言会接受它。一切尽可能使用最少的字符数?实际上几乎从来没有必要重复。Ruby解释器将始终以相同的方式计算表达式的真值,无论是否使用双重爆炸。因此,双重撞击只会引入更多的计算,而不会带来技术收益。(好处在于安抚[某些]人类的思想。)实际上[至少]有一个地方需要双重打击:当你将转换为_json
时,nil
将变为null
,因此如果你想让json中的值实际为true
或false
,你需要加倍努力。所以基本上,!!foo
相当于not(foo==nil或foo==false)