2017-12-05 1 views
1

Ich habe versucht, eine coding puzzle zu lösen: Nimm Strings und zähle diejenigen, die keine wiederholten Wörter enthalten.Ruby-Blöcke verhalten sich bei der Verwendung von "do" unerwartet.

Dieser Code funktioniert:

def validate(passphrase) 
    words = passphrase.split 
    words == words.uniq 
end 

passphrases = File.readlines("../input/passphrases.txt") 

p passphrases.count {|phrase| validate(phrase)} 
#=> 337 

Wenn ich eine kleine Änderung mit dem Zählungsblock machen, sie alle der Paßphrasen zählt, anstatt nur diejenigen, die wahre zurückkehren würde, wenn sie durch den Block geführt:

p passphrases.count do |phrase| 
    validate(phrase) 
end 
#=>512 

Was ist los?

+1

@sawa, die Frage, die Sie verweisen fragt, ob 'do ... end' oder' {... } sollte im Allgemeinen verwendet werden, was anders ist als diese Frage, aber die ausgewählte Antwort auf die referenzierte Frage ist in der Tat die Antwort auf diese Frage. Ist das eine Dupe der früheren Frage? Interessant. –

Antwort

3

Es ist aufgrund der Argument Vorrang mit dem do Block.

Ihr erstes Beispiel ist äquivalent zu:

p(passphrases.count {|phrase| validate(phrase)})

das zweite mit dem do Block entspricht:

p(passphrases.count) do |phrase| 
    validate(phrase) 
end 

Wo der do auf die p Funktion angewendet wird.

Wenn Sie der zweite Fall, dass die erste übereinstimmen, wickeln Sie den ganzen Block in Klammern:

p(passphrases.count do |phrase| 
    validate(phrase) 
end) 
+0

Also, warum ruft nicht Aufruf von p mit einem Block nicht einen Fehler und scheint auch nichts zu tun? –

+0

@FluffyRibbit Warum würde es einen Fehler werfen? Sie können jede Methode mit einem Block aufrufen, es liegt an der Methode, den Block zu verwenden, wenn er es möchte. Leider gibt es für eine Methode keine Möglichkeit zu sagen, dass sie einen Block benötigt oder nicht. –

+1

@muistooshort Kann nicht eine Methode sagen, dass mit 'raise 'ich einen Block" es sei denn block_given? 'Und' raise "Ich will keinen Block" wenn block_given? '? –

Verwandte Themen