2013-01-15 39 views
1

所以我很喜歡這句法和Lisp:在Ruby中獲取Lisp樣式(+ *參數)的最簡單方法是什麼?

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

我想添加在Ruby中的項目清單,並希望儘可能地接近這一點。 現在,我的最佳解決方案涉及一個數組和收集/映射方法。

所以:

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

但是...

我想方法添加到這裏面可以返回零。

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 

在我試圖破解並實施格林斯潘的規則之前有什麼建議嗎? (編程的確是一個強迫

+0

我一直認爲Ruby上的Lisp語法會很棒。我認爲那就是你想要做的事情。 – Linuxios

回答

4
  • 已經有一個做你想做什麼方法inject
  • 不影響一些更改nil了一些很簡單:。使用to_i(或to_f如果你正在處理浮動)。

[ 
    booking_fee, 
    rental_charges, 
    internationalization_charges, 
    discounts, 
    wild_nights, 
].inject(0){|sum, item| sum + item.to_i} 
10

我真的不明白你的曲estion。如果你想工作方式類似於+的方法確實在Lisp語言,即採用的參數爲任意數,是前綴的位置,而不是中綴,這是微不足道的:如果你想獲得

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

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

真的看中,你可以覆蓋一元前綴+運營商Array S:

class Array 
    def [email protected] 
    inject(:+) 
    end 
end 

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

請不要那樣做!

我不明白你的問題的其餘部分是如何與Lisp風格的加法操作相關的。

如果您想從Array中刪除nil,那麼可以使用Array#compact

+0

Lol剛纔知道一元+也可以超載!謝謝:-) – texasbruce

+0

@JörgWMittag - 只有我見過這些預修復操作符的地方在SICP中,所以......我認爲它是Lisp風格的語法......但我想Ruby也有(它的)一些!謝謝。 – ovatsug25

+1

@texasbruce:除了'defined?',您可以覆蓋所有Ruby的一元前綴運算符。方法名是'+ @'('''',' - @'(''',''''''''''''''''''''''''''''''''' /'to_a'('*'aka * splat *)。 –

相關問題