1

所以我真的很喜欢 Lisp 中的这种语法:

 (+ 1 1 2 3 5 8 13)
 => 33

我想在 Ruby 中添加一个项目列表,并希望尽可能地近似它。现在,我最好的解决方案涉及一个数组和 collect/map 方法。

所以:

sum = 0; [1,1,2,3,5,8,13].collect { |n| sum += n }

但...

我想为此添加可以返回 nil 的方法。

sum = 0; [1, booking_fee, 8,13].collect { |n| n = 0 if n.nil?; sum += n }

这样做真的很好,中间的所有行都引用可能返回 nil 的方法,但我不能以这种方式完全构建数组。这只是我希望我的语法看起来像的一个想法。

def total
  Array.new do
    booking_fee
    rental_charges
    internationalization_charges
    discounts
    wild_nights
  end.collect { |n| n = 0 if n.nil?; sum += n }
end

在我尝试破解并执行 Greenspun 规则之前有什么建议吗?(编程确实是一种强迫症。

4

2 回答 2

10

我真的不明白你的问题。如果你想要一个像+Lisp 中那样工作的方法,即接受任意数量的参数并且位于前缀位置而不是中缀位置,这很简单:

def plus(*nums)
  nums.inject(:+)
end

plus 1, 1, 2, 3, 5, 8, 13 # => 33

如果你想变得更花哨,你可以覆盖 s 的一元前缀+运算符Array

class Array
  def +@
    inject(:+)
  end
end

+[1, 1, 2, 3, 5, 8, 13] # => 33

请不要那样做!

我看不出您的问题的其余部分与 Lisp 样式的加法操作有什么关系。

如果您想从 s 中删除nils Array,那么就是Array#compact这样。

于 2013-01-15T02:57:15.067 回答
4
  • 已经有一种方法inject可以做你想做的事。
  • 在不影响数字的情况下更改nil为数字很容易:使用to_i(或者to_f如果您正在处理浮点数)。

.

[
  booking_fee,
  rental_charges,
  internationalization_charges,
  discounts,
  wild_nights,
].inject(0){|sum, item| sum + item.to_i}
于 2013-01-15T02:56:10.500 回答