2 Stimmen

Ist es möglich, Lambdas in Ruby wie folgt zu verwenden?

Hier ist, was ich in Python ziemlich oft mache:

simple_call = lambda name: extract(some[fairly][hidden], name)
result1 = simple_call('meinname')
result2 = simple_call('deinname')
result3 = simple_call('seinname')

Dies ist wirklich praktisch, wenn Sie wiederholt Daten aus einer komplexen Datenstruktur oder einer seltsamen API extrahieren müssen.

Gibt es einen Weg, um das Gleiche in Ruby zu tun?

6voto

Serabe Punkte 3816

Kurze Antwort: Nein. Das Nächste wäre:

simple_call = lambda {|name| extract(some[:fairly][:hidden], name) }
result1 = simple_call.call("meinname")
result2 = simple_call.call("deinname")
result3 = simple_call.call("seinname")

Warum? Weil Klammern in Ruby optional sind. Daraufhin musst du Ruby mitteilen, die Methode aufzurufen. Zum Beispiel könntest du in Python folgendes tun:

another_simple_call = simple_call

Und du weist dem lambda another_simple_call zu. Aber in Ruby gäbe es keine Möglichkeit zu wissen, ob du simple_call ohne Argumente zuweist oder aufrufst.

6voto

Jörg W Mittag Punkte 349574

Ja, es gibt eine Möglichkeit, das Gleiche in Ruby zu tun. Und es ist tatsächlich der gleiche Weg (abgesehen von den geringfügigen syntaktischen Unterschieden zwischen Python und Ruby, natürlich):

simple_call = ->name { extract(some[fairly][hidden], name) }
result1 = simple_call.('meinname')
result2 = simple_call.('deinname')
result3 = simple_call.('seinname')

5voto

arnep Punkte 5583

Ein Äquivalent in Ruby wäre

a = Proc.new{|name| do_something_with(name) }

a.call("beliebigername")

4voto

Rob Di Marco Punkte 40364

Ein anderer Weg, wie ich so etwas mache, ist, Blöcke und einen Kartenbefehl zu verwenden, anstatt Lambdas zu verwenden.

Also mache etwas wie:

result1, result2, result3 = %w(meinname deinname seinname).map {|name|
    extract(etwas[zimlich][versteckt], name)
}

Ich finde, dass es sich etwas besser liest.

2voto

dnch Punkte 9495

Ja:

beliebige_datenstruktur = {
  :foo => {
    :bar => "1",
    :baz => "2",    
  }
}

extrakt_prozess = lambda { |x| beliebige_datenstruktur[:foo][x] }

puts extrakt_prozess.call(:bar) # => "1"
puts extrakt_prozess.call(:baz) # => "2"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X