Domanda

Spesso inserisco lambda preconfigurati in metodi enumerabili come 'map', 'select' ecc. ma il comportamento di "iniettare" sembra essere diverso. per esempio. con

mult4 = lambda {|item| item * 4 }

poi

(5..10).map &mult4

mi dà

[20, 24, 28, 32, 36, 40]

Tuttavia, se creo una lambda a 2 parametri da utilizzare con un'iniezione in questo modo,

multL = lambda {|product, n| product * n }

Voglio essere in grado di dire

(5..10).inject(2) &multL

poiché "inject" ha un parametro singolo facoltativo per il valore iniziale, ma questo mi dà ...

irb(main):027:0> (5..10).inject(2) &multL
LocalJumpError: no block given
        from (irb):27:in `inject'
        from (irb):27

Tuttavia, se inserisco '& amp; multL' in un parametro secondo da iniettare, allora funziona.

irb(main):028:0> (5..10).inject(2, &multL)
=> 302400

La mia domanda è " perché funziona e non il tentativo precedente? "

È stato utile?

Soluzione

Quindi la ragione che

(5..10).map &mult4

funziona e

(5..10).inject(2) &multL

non è che nel primo caso i rubens parens siano impliciti, quindi significa davvero

(5..10).map(&mult4)

se lo desideri, per il secondo caso puoi usare

(5..10).inject 2, &multL

Il trucco esterno alle parentesi funziona solo per passare i blocchi a un metodo, non agli oggetti lambda.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top