2016-08-01 14 views
-1

Also, ich versuche, die method_missing in Ruby zu schreiben hat die method_missing drei Parameter alsblock_given? immer false zurück

def method_missing(mId,*args,&block) 
    if (args.empty? && !block_given?) 
      puts " Sample One No arguments were given nor block" 
     elsif (!args.entries.empty?) 
      puts " there was arguments given" 
     elsif (block_given?) 
      puts "there was ?code given" 
    end 
end 

Das Problem Aufruf instance.anything { "Block"} gezeigt gibt immer "Sample One Keine Argumente waren gegeben noch Block ". ist klar, dass block_given immer false zurückgibt, aber warum?

+2

nicht reproduzieren können: 'Foo.new.anything {} # gibt es Code given' –

Antwort

0

Dieser nahm ein wenig rätselhaft.

Es ist nichts falsch mit block_given, außer Ihre Prüfung ist verschachtelt in einem "wenn sonst" Block. (Das ist zu lang; habe die Zusammenfassung nicht gelesen)

Sie würden nur sehen, dass "Code gegeben wurde", wenn Sie keine Argumente in Ihre Funktion übergeben haben. Das Übergeben von Argumenten löst die !args.entries.empty? if aus, wenn if gefunden wird und alle weiteren else-Anweisungen nicht ausgeführt werden.

(Versuchen Sie dies zu Hause: versuchen Sie, Ihre Methode ohne Argumente und nur einen Block aufzurufen, dann mit Argumenten und einem Block).

Wenn Ihre erwartete/gewünschte Ausgabe ist: there was arguments given there was ?code given

Dann stattdessen versuchen, diese Methode. Beachten Sie, wie ich Ihre letzte elsif eine einfache if Erklärung:

def method_missing(mId,*args,&block) if (args.empty? && !block_given?) puts " Sample One No arguments were given nor block" elsif (!args.entries.empty?) puts " there was arguments given" end if (block_given?) puts "there was ?code given" end
end

+0

In der letzten Zeile der Frage, schreibt der OP, dass Aufruf' instance.anything { "Block" } ', dh ohne Argumente aber mit einem Block funktioniert auch nicht, was nicht mit Ihrer Erklärung übereinstimmt. –

+0

Hat nicht funktioniert es führt auch puts "Sample One Es wurden keine Argumente gegeben noch block" –

1

Sie haben ein wenig kompliziert Logik in Ihrer Methode und das ist der Hauptgrund, warum es nicht Ihren Erwartungen entsprechend funktioniert. Es gibt kein Problem mit block_given?

Auch sehe ich keinen Grund in args.entries.empty? Verwendung. args.empty? gibt Ihnen das gleiche Ergebnis, aber es sieht klarer aus.

Ursprüngliche Methode könnte so umgeschrieben werden, aber ich würde bemerken, dass Sie einen Fall nicht abgedeckt haben, wenn die Methode mit Argumenten und einem Block aufgerufen werden kann. Ich weiß nicht, ob es Absicht war oder nicht.

def method_missing(mid, *args, &block) 
    if args.count > 0 
    puts "there were arguments found" 
    else 
    if block_given? 
     puts "there was a code found" 
    else 
     puts "Sample One No arguments were given nor block" 
    end 
    end 
end 

Beispiel, das zeigt, dass block_given? funktioniert:

class A 
    def method_missing(mid, *args, &block) 
    p block 
    p block_given? 
    end 
end 

A.new.aaaa 
nil 
false 
=> false 

A.new.aaaa { "aaaa" } 
#<Proc:[email protected](irb):8> 
true 
=> true 
+0

Ich möchte bestimmte Prozedur passieren, wenn es ein leeres 1-leeres Argument gibt, 2-Schlüssel-Wert Paar wurde in der übergeben Argument, 3-Block Code wurden übergeben. Beachten Sie, dass beim Übergeben des Codeblocks Argumente angegeben werden, die auch Fall 1 erfüllen. –

+0

Wenn Sie überprüfen möchten, ob Schlüsselwortargumente in der Methode übergeben wurden, verwenden Sie die doppelte splat-Notation, um sie in einer Variablen zu sammeln zu dieser Variable eines Hash-Typs. method_missing (mittel, * args, ** kwargs, & block) https: //flushentiepacket.github.io/ruby ​​/ 2015/03/31/ruby-keyword-argumente-the-double-splat-and-starsnake.html http://Stackoverflow.com/questions/18289152/what-does-a-double-splat- Betreiber-tun – SunnyMagadan

Verwandte Themen