安全地呼叫方法

时间:2011-09-11 07:31:12

标签: ruby

有一种很好的写法:

a = one.two.three.four

其中“一” - 分配,“两” - 零。这个陈述是个例外。

如果“两个”,“三个”,“四个”中的任何一个为零,我想要“a”为零,否则在“a”中有“四个”的结果。

是否可以在不编写条件语句的情况下执行此操作?

2 个答案:

答案 0 :(得分:4)

首先,您需要确定此代码是否违反了Law of Demeter。如果是这种情况,那么解决此问题的正确方法是以这种方式不编写代码。

你怎么知道它是否打破它? Here是一篇试图解释如何应用于Ruby语言的文章。

在你的情况下,你会将其分解为多个调用,并在其周围使用guard子句。在调用one.two.three.four中,我们可以假设fourthree的属性(而不是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_zipcodeInvoice#customer_primary_address_zip_code(或者更好的缩写名称,这会更有意义)

答案 1 :(得分:0)

a = one.try(:two).try(:three).try(:four)