2014-08-29 57 views
-5

我是Ruby的新手。什么是印刷品,为什么?向我解释这个简单的红宝石代码

a = nil 
b = 2 
a ||= b 
puts a 

向我解释这个简单的代码。

+0

a || = b是a = a ||的简短手段b因为a是零(和falsy)b会打印出来2,只需打开irb并自己尝试。 – Doon 2014-08-29 12:40:58

+0

这不是一个真正的Ruby问题,它是适用于所有语言的基本编程逻辑。一本好的编程教科书将会覆盖它。 – 2014-08-29 16:12:32

回答

1

很多编程需要理解布尔逻辑,基本上如何确定真值和假值,这是触发条件逻辑的原因分支,循环等

考虑一下:

Ruby中有真假值,其中有truefalse相当于保留字(实际上远不止这一点,但认为更深层次的是对不同的时间。 ):

true # => true 
false # => false 

只有nilfalse是Ruby的假值,其他一切都是true。这不同于其他一些语言,如Perl,它认为0''(空字符串)也是错误的。请记住,Ruby中只有nilfalse是错误的。

的 “非” 值的truefalse(AKA,对立)分别falsetrue。该!(布尔“NOT”)运算符用于此:

!true # => false 
!false # => true 

现在,这是一招,你会看到高级程序员使用:NOT-ING他们两次返回其原始值的布尔版本:

!!true # => true 
!!false # => false 

这是一个重要的事情要了解。我们可以用值!!除了true/false并确定它们是否是真的还是假的值:

!!'' # => true # !> string literal in condition 
!!0 # => true # !> literal in condition 
!!'foo' # => true # !> string literal in condition 
!!1 # => true # !> literal in condition 

Ruby是不是太高兴,我使用一个字面的测试,但你可以看到,上文全部为真,这些都是假的:

!!false # => false 
!!nil # => false 

希望你看到我们如何看待值的语言两种方式,无论他们是真/假和其实际价值是什么。

继续前进:

||(布尔 “OR”)着眼于左侧的价值第一。如果它是真的,它会返回该值。如果是假的,它看起来在右侧,并返回:

true || false # => true 
false || true # => true 

nil || 'foo' # => "foo" 
false || 2 # => 2 

||=运营商的行为类似,只有比较之后,它分配到左边的变量,如果它是一个假的类型值:

a = false 
a ||= true 
a # => true 

a = true 
a ||= false 
a # => true 

分配给变量,而不是直接对文字测试,结果类似的结果:

a = nil # => nil 
!a # => true 
!!a # => false 

b = 2 # => 2 
!b # => false 
!!b # => true 

多一点:

||=用作速记取代的一点点if/then代码:

a = nil # => nil 
b = 2 # => 2 
if !a 
    a = b 
end 
a # => 2 

a = 1 # => 1 
b = 2 # => 2 
if !a 
    a = b 
end 
a # => 1 

而且所有通向该代码你想明白:

a = nil # => nil 
b = 2 # => 2 
a ||= b # => 2 
+0

哇,很好的回答! – Mischa 2014-08-31 15:57:04

2

2被打印出来,因为||=在左侧变量为nilfalse时将右侧值赋给左侧变量。 anil,所以2将被分配到a。因此打印2

0

我相信||=是说的简写方式, “如果a是假的把它分配给......” 在这种情况下b

所以

a = nil 
b = 2 
a ||= b 
puts a 
    > 2 

a = 4 
b = 2 
a ||= b 
puts a 
    > 4 
+0

这并不是说“如果a是零”,它是说“如果a是假的”。在Ruby中,零和“假”是错误的值,其他的都是“真”。 – 2014-08-29 15:36:05

+0

@TheTinMan:感谢您的更正!完全正确。我已经更新了我的回答 – 2014-09-01 09:45:19