2010-09-29 4 views
20

Ich will das etwas Ähnliches tun:Ruby: Können Lambda-Funktionsparameter Standardwerte haben?

def creator() 
     return lambda { |arg1, arg2 = nil| 
       puts arg1 
       if(arg2 != nil) 
         puts arg2 
       end 
     } 
end 

test = creator() 

test('lol') 
test('lol', 'rofl') 

ich einige Syntaxfehler erhalten:

test.rb:2: syntax error 
     return lambda { |arg1, arg2 = nil| 
           ^
test.rb:3: syntax error 
test.rb:7: syntax error 
test.rb:14: syntax error 

ist das möglich in Ruby? Ich möchte für einen Parameter auf eine Lambda-Funktion einen Standardwert gesetzt

Antwort

44

In Ruby 1.9+, können Sie eine der beiden alten Stil lambdas oder dem neuen „Pfeil“ Lambda-Syntax verwenden einen Standardparameter einzustellen:

ruby-1.9.1-p378 > f = lambda {|x, y=1| puts(x+y) } 
=> #<Proc:[email protected](irb):4 (lambda)> 
ruby-1.9.1-p378 > f.call(1) 
2 
=> nil 
ruby-1.9.1-p378 > f.call(1,5) 
6 
=> nil 

ruby-1.9.1-p378 > f = ->(a, b=5) { puts(a+b) } 
=> #<Proc:[email protected](irb):1 (lambda)> 
ruby-1.9.1-p378 > f.call(1) 
6 
=> nil 
ruby-1.9.1-p378 > f.call(1,2) 
3 
=> nil 
+4

Vorsicht, Passing Nil wird nicht den Standard auslösen: – mmell

+0

In Ruby 1.9.3 bekomme ich einen Syntaxfehler, wenn Sie ein Leerzeichen zwischen der Stabby Lamba und der Klammer setzen 'f-> (x = 123) {...} '. Es funktioniert ohne Leerzeichen 'f -> (x = 123) {...}'. –

+0

für 'l = -> (k, v, r = nil) {}' erhebe einen ArgumentError wenn '{a:" A "}. Jedes & l' aber kein Fehler wenn' {a: "A"} each {| k, v | l.call (k, v)} ' –

14

In Ruby 1.8.x Sie es von gefälschten entlang der Linien von sortieren:

def creator 
    lambda do |*args| 
    raise ArgumentError if args.empty? || args.size > 2 
    arg1, arg2 = args 
    puts arg1 
    puts arg2 unless arg2.nil? 
    end 
end 

>> test = creator 
=> #<Proc:[email protected](irb):2> 
>> test.call("foo") 
foo 
=> nil 
>> test.call("foo", "bar") 
foo 
bar 
=> nil 
>> test.call("foo", "bar", "baz") 
ArgumentError: ArgumentError 

Edit: die obigen Beispiel defaults das zweite Argument zu nil, aber wenn Sie Sie eine andere Standard haben wollen kannzuweisenbasierend auf args.size (z.B. arg2 = mydefault if args.size < 2). Wenn Sie mehr als zwei Argumente haben, werden die nicht angegebenen standardmäßig auf nil gesetzt, sofern Sie sie nicht selbst zuweisen.

Für Ruby 1.9 + siehe andere Antworten.

Verwandte Themen