为什么我在Ruby中看到两个表达式的结果不同,一个使用'&&';,其他用途';和';操作人员
打印(-1==-1)和(myobj.nil?) 真的 打印(-1==-1)&(myobj.nil?) 假的 注意,myobj.nil?返回false为什么我在Ruby中看到两个表达式的结果不同,一个使用'&&';,其他用途';和';操作人员,ruby,expression,Ruby,Expression,打印(-1==-1)和(myobj.nil?) 真的 打印(-1==-1)&(myobj.nil?) 假的 注意,myobj.nil?返回false 所以,这不应该总是错误的。因为它们具有不同的运算符优先级 第一种评估为: (print (-1 == -1)) and (myobj.nil?) 它打印true,因为-1==-1,然后print返回nil和nil,false为nil 第二个相当于: print ((-1 == -1) && (myobj.nil?)) 它打印(t
所以,这不应该总是错误的。因为它们具有不同的运算符优先级 第一种评估为:
(print (-1 == -1)) and (myobj.nil?)
它打印true,因为-1==-1,然后print返回nil和nil,false
为nil
第二个相当于:
print ((-1 == -1) && (myobj.nil?))
它打印(true和false),这是false,然后print返回nil。,因为它们具有不同的运算符优先级 第一种评估为:
(print (-1 == -1)) and (myobj.nil?)
它打印true,因为-1==-1,然后print返回nil和nil,false
为nil
第二个相当于:
print ((-1 == -1) && (myobj.nil?))
它打印(true&&false),该值为false,然后打印返回nil。
&&
和的优先级不同。特别是,和
的优先级非常低,几乎比其他任何东西都低
print
的返回值是nil
,至少在Ruby 1.8中是这样。因此,第一个表达式如下所示:
(print (-1 == -1)) and myobj.nil?
(print true) and myobj.nil? # => with the side-effect of printing "true"
nil and myobj.nil?
nil
print ((-1 == -1) && myobj.nil?)
print ( true && myobj.nil?)
print myobj.nil?
print false # => with the side-effect of printing "false"
nil
第二个表达式如下所示:
(print (-1 == -1)) and myobj.nil?
(print true) and myobj.nil? # => with the side-effect of printing "true"
nil and myobj.nil?
nil
print ((-1 == -1) && myobj.nil?)
print ( true && myobj.nil?)
print myobj.nil?
print false # => with the side-effect of printing "false"
nil
&&
和和
具有不同的优先级。特别是,和
的优先级非常低,几乎比其他任何东西都低
print
的返回值是nil
,至少在Ruby 1.8中是这样。因此,第一个表达式如下所示:
(print (-1 == -1)) and myobj.nil?
(print true) and myobj.nil? # => with the side-effect of printing "true"
nil and myobj.nil?
nil
print ((-1 == -1) && myobj.nil?)
print ( true && myobj.nil?)
print myobj.nil?
print false # => with the side-effect of printing "false"
nil
第二个表达式如下所示:
(print (-1 == -1)) and myobj.nil?
(print true) and myobj.nil? # => with the side-effect of printing "true"
nil and myobj.nil?
nil
print ((-1 == -1) && myobj.nil?)
print ( true && myobj.nil?)
print myobj.nil?
print false # => with the side-effect of printing "false"
nil
但为什么在这种情况下,-1==-1的计算结果总是true,而myobj.nil呢?计算结果为false。因此,净结果应该始终为false。哦,好吧,那么如果在if(-1==-1)和(myobj.nil?)这样的条件表达式中使用它,那么它们的结果是相同的?@Shekhar:print
的返回值是nil
,至少在Ruby 1.8中是这样。因此,第一个表达式的大小如下:(print(-1==-1))和myobj.nil?
→ <代码>(打印正确)和myobj.nil?→ nil和myobj.nil?
(具有打印true的副作用)→ nil
,而第二个表达式的大小如下:print(-1=-1)和&myobj.nil?
→ <代码>打印(真与否?→ <代码>打印myobj.nil?→ <代码>打印错误→ <代码>无(有打印错误的副作用)。Jorg,谢谢。这真的很有帮助,因为我从来没有意识到打印被认为是表达式的一部分。但在这种情况下,为什么这很重要,-1==-1的计算结果总是为true,而myobj.nil?计算结果为false。因此,净结果应该始终为false。哦,好吧,那么如果在if(-1==-1)和(myobj.nil?)这样的条件表达式中使用它,那么它们的结果是相同的?@Shekhar:print的返回值是nil
,至少在Ruby 1.8中是这样。因此,第一个表达式的大小如下:(print(-1==-1))和myobj.nil?
→ <代码>(打印正确)和myobj.nil?→ nil和myobj.nil?
(具有打印true的副作用)→ nil
,而第二个表达式的大小如下:print(-1=-1)和&myobj.nil?
→ <代码>打印(真与否?→ <代码>打印myobj.nil?→ <代码>打印错误→ <代码>无(有打印错误的副作用)。Jorg,谢谢。这真的很有帮助,因为我从未意识到打印被认为是表达式的一部分。欢迎使用StackOverflow!今后,请先搜索现有问题,然后再提出自己的问题。很可能,它已经被问到了,更重要的是,它已经得到了回答。这样,我们避免了重复,并将所有答案整齐地放在一个地方。可能的重复项:,,,。@Jörg:在堆栈溢出中搜索和和&
无效,在“提问”中输入问题标题不会显示任何重复项。堆栈溢出的常客应该知道相关问题的存在。欢迎来到堆栈溢出!今后,请先搜索现有问题,然后再提出自己的问题。很可能,它已经被问到了,更重要的是,它已经得到了回答。这样,我们避免了重复,并将所有答案整齐地放在一个地方。可能的重复项:,,,。@Jörg:在堆栈溢出中搜索和和&
无效,在“提问”中输入问题标题不会显示任何重复项。不过,堆栈溢出的常客应该知道存在相关的问题。