我正在处理一个项目,其中有几个我不熟悉的以下模式的实例。我不知道该怎么称呼它,所以我找不到任何文档。以下是什么概念?有条件的红宝石分配
if [email protected] = [nil, 2].sample
puts 'there was an error'
else
puts @two
end
感谢
我正在处理一个项目,其中有几个我不熟悉的以下模式的实例。我不知道该怎么称呼它,所以我找不到任何文档。以下是什么概念?有条件的红宝石分配
if [email protected] = [nil, 2].sample
puts 'there was an error'
else
puts @two
end
感谢
它基本上斜靠在Ruby的falsy对象:nil
和false
。
在Ruby中,除nil
和false
之外的所有内容都被称为truthy。
因此,在例如其打印的@two
值,如果它是truthy(2),否则(nil
)它则输出错误消息。
我不认为这个“概念”有一个名字。
“如果真的是真的......”这是否意味着如果右侧的任务是真的? –
@JoeEssey你在这两种情况下抨击'@ two'。这是分配的值的问题 - 真理('2')或者虚假('nil') –
这里没有什么特别,它是等效于:
@two = [nil, 2].sample
if [email protected]
puts 'there was an error'
else
puts @two
end
@two = [nil, 2].sample
从[nil, 2]
返回一个随机元素,即或者nil
或2
,并将其分配给该实例变量@two
。
条件应该是不言自明的。
使用条件赋值表达式的值并没有真正有一个名本身,而是包裹在括号中分配的做法称为"Safe assignment in condition",这是你应该采取,如果事情的做法你正在编写这样的代码。
这就是我正在寻找的东西。我测试了它,它工作,但它似乎刚刚关闭。很高兴看到风格指南解决这个问题。 –
请尽量避免双重否定。将其转化为一个积极的测试,并且颠倒“puts”语句的顺序会使这更加明智。如果你不小心,最终可能会出现三重和四重底线,这些都是真正的头脑风暴。 – tadman
这是可怕的代码。除了@ tadman的评论之外,这还不是很清楚:'@two = [nil,2] .sample;放@two? @two:“出现错误”。 –
更好的办法是编写一个类似'def coin_flip; [:heads,:tails] .sample; end'然后是'if(coin_flip ==:heads)',它表达了更多这里发生的事情。 – tadman