1

だから私はLispでこの構文が本当に好きです:

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

Ruby でアイテムのリストを追加したいのですが、これをできる限り近似したいと考えています。現在、私の最善の解決策には、配列と収集/マップ メソッドが含まれます。

そう:

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

ハッキングしてグリーンスパンの法則を実行しようとする前に何か提案はありますか? (プログラミングは確かに強制です。

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 スタイルの加算操作にどのように関連しているのかわかりません。

nilから sを削除したい場合はArrayArray#compactそのためのものがあります。

于 2013-01-15T02:57:15.067 に答える
4
  • injectあなたが望むことをするための方法はすでにあります。
  • nil数値に影響を与えずに数値に変更するのは簡単です: を使用しますto_i(またはto_ffloat を扱っている場合)。

.

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