6

タイトルのショートコードはHaskellにあり、次のようなことを行います

list.map {|x| x + 1}

ルビーで。

私はそのマナーを知っていますが、私が知りたいのは、Haskellのようにルビーで同じことを実装するためのよりエレガントなマナーはありますか?

この形式のように、私to_procはルビーのショートカットが大好きです。

[1,2,3,4].map(&:to_s)
[1,2,3,4].inject(&:+)

ただし、これはProcとメソッドの間で完全に一致する引数番号のみを受け入れます。

私は、最初のデモンストレーションのように役に立たない一時的なブロック/変数を使用せずに、1つ以上の引数をProcに余分に渡すことができる方法を模索しています。

私はこのようにしたい:

[1,2,3,4].map(&:+(1))

ルビーにはこれを行うための同様のマナーがありますか?

4

6 に答える 6

7

1つだけ追加したい場合は、次のsucc方法を使用できます。

>> [1,2,3,4].map(&:succ)
=> [2, 3, 4, 5]

2つ追加したい場合は、ラムダを使用できます。

>> add_2 = ->(i) { i + 2 }
>> [1,2,3,4].map(&add_2)
=> [3, 4, 5, 6]

任意の値の場合、ラムダを構築するラムダを使用できます。

>> add_n = ->(n) { ->(i) { i + n } }
>> [1,2,3,4].map(&add_n[3])
=> [4, 5, 6, 7]

ラムダ生成メソッドを使用することもできます。

>> def add_n(n) ->(i) { i + n } end
>> [1,2,3,4].map(&add_n(3))
=> [4, 5, 6, 7]
于 2012-05-25T19:24:04.480 に答える
5

ampex gemを使用します。これにより、のメソッドを使用しXて、任意のprocを1つの変数に構築できます。仕様の例を次に示します。

["a", "b", "c"].map(&X * 2).should == ["aa", "bb", "cc"]
于 2012-05-25T19:30:55.550 に答える
3

デフォルトでは直接実行できませんmap。ただし、このタイプの機能をサポートするバージョンを実装するのは非常に簡単です。例として、RubyFacetsにはそのようなメソッドが含まれています。

require 'facets/enumerable'

[1, 2, 3, 4].map_send(:+, 10)
=> [11, 12, 13, 14]

実装は次のようになります。

def map_send(meth, *args, &block)
  map { |e| e.send(meth, *args, &block) }
end
于 2012-05-25T19:27:23.013 に答える
2

この特定のケースでは、以下を使用できます。

[1, 2, 3, 4].map(&1.method(:+))

ただし、これ+は連想的ではないためにのみ機能します。-たとえば、それは機能しません。

于 2012-05-25T23:02:57.573 に答える
1

Rubyにはこの機能のサポートが組み込まれていませんが、独自の拡張機能を作成することも、小さなgem'ampex 'を使用することもできます。これは、拡張された'to_proc'機能を使用してグローバル変数Xを定義します。

それはあなたにそれをする可能性を与えます:

[1,2,3].map(&X.+(1))

またはそれでも:

"alpha\nbeta\ngamma\n".lines.map(&X.strip.upcase) 
于 2012-05-25T19:32:46.470 に答える
0

1を追加するだけの場合は、nextまたはsucc:を使用できます。

[1,2,3,4].map(&:next)
[1,2,3,4].map(&:succ)
于 2012-05-25T19:21:06.090 に答える