2016-09-14 121 views
1

我正在处理一个项目,其中有几个我不熟悉的以下模式的实例。我不知道该怎么称呼它,所以我找不到任何文档。以下是什么概念?有条件的红宝石分配

if [email protected] = [nil, 2].sample 
    puts 'there was an error' 
else 
    puts @two 
end 

感谢

+3

请尽量避免双重否定。将其转化为一个积极的测试,并且颠倒“puts”语句的顺序会使这更加明智。如果你不小心,最终可能会出现三重和四重底线,这些都是真正的头脑风暴。 – tadman

+0

这是可怕的代码。除了@ tadman的评论之外,这还不是很清楚:'@two = [nil,2] .sample;放@two? @two:“出现错误”。 –

+0

更好的办法是编写一个类似'def coin_flip; [:heads,:tails] .sample; end'然后是'if(coin_flip ==:heads)',它表达了更多这里发生的事情。 – tadman

回答

2

它基本上斜靠在Ruby的falsy对象:nilfalse

在Ruby中,除nilfalse之外的所有内容都被称为truthy

因此,在例如其打印的@two值,如果它是truthy(2),否则(nil)它则输出错误消息。

我不认为这个“概念”有一个名字。

+0

“如果真的是真的......”这是否意味着如果右侧的任务是真的? –

+0

@JoeEssey你在这两种情况下抨击'@ two'。这是分配的值的问题 - 真理('2')或者虚假('nil') –

1

这里没有什么特别,它是等效于:

@two = [nil, 2].sample 

if [email protected] 
    puts 'there was an error' 
else 
    puts @two 
end 

@two = [nil, 2].sample[nil, 2]返回一个随机元素,即或者nil2,并将其分配给该实例变量@two

条件应该是不言自明的。

1

使用条件赋值表达式的值并没有真正有一个本身,而是包裹在括号中分配的做法称为"Safe assignment in condition",这是你应该采取,如果事情的做法你正在编写这样的代码。

+0

这就是我正在寻找的东西。我测试了它,它工作,但它似乎刚刚关闭。很高兴看到风格指南解决这个问题。 –