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
位置时,您可能会感到非常困惑。在这种情况下,添加
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)