有一种很好的写法:
a = one.two.three.four
其中“一” - 分配,“两” - 零。这个陈述是个例外。
如果“两个”,“三个”,“四个”中的任何一个为零,我想要“a”为零,否则在“a”中有“四个”的结果。
是否可以在不编写条件语句的情况下执行此操作?
答案 0 :(得分:4)
首先,您需要确定此代码是否违反了Law of Demeter。如果是这种情况,那么解决此问题的正确方法是以这种方式不编写代码。
你怎么知道它是否打破它? Here是一篇试图解释如何应用于Ruby语言的文章。
在你的情况下,你会将其分解为多个调用,并在其周围使用guard子句。在调用one.two.three.four
中,我们可以假设four
是three
的属性(而不是three
返回的对象)。而three
将是two
的属性。所以你要在two
中添加一个方法:
# Note: This is an over-simplified example
def three_four
return unless three
three.four
end
在one
你会得到:
def two_three_four
return unless two
two.three_four
end
一个更相关的例子:
invoice.customer.primary_address.zipcode
所以你会有Customer#primary_address_zipcode
和Invoice#customer_primary_address_zip_code
(或者更好的缩写名称,这会更有意义)
答案 1 :(得分:0)
a = one.try(:two).try(:three).try(:four)