2 Stimmen

Problem mit der Methode Array.find

Ich finde diese Zeile im ZenTest-Quellcode:

result = @test_mappings.find { |file_re, ignored| filename =~ file_re }

El @test_mappings y result hier sind beide Array-Objekt, aber ich habe nicht gefunden 'find' Methode auf Array-Klasse in Ruby doc. Ich habe es auch auf irb versucht:

irb(main):014:0> Array.respond_to? :find
=> false
irb(main):015:0> [1,2,3].find
LocalJumpError: no block given
        from (irb):15:in `find'
        from (irb):15:in `each'
        from (irb):15:in `find'
        from (irb):15
irb(main):016:0> [1,2,3].find{|x| x>1}
=> 2

Kann mir das jemand erklären? Wie kann die Find-Methode auch ein Array-Objekt zurückgeben? Vielen Dank im Voraus.

8voto

Gordon Wilson Punkte 25922

Array umfasst die Enumerable Modul, das die find Methode.

In Ihrem Beispiel haben Sie getestet Array.respond_to . Dies ergibt nur true für Klassenmethoden der Array . find ist eine Instanzmethode, also respond_to? muss mit einer Instanz der Klasse aufgerufen werden.

>> a = Array.new
=> []
>> a.respond_to? :find
=> true

2voto

paulthenerd Punkte 9482

Ein anderer manchmal nützlicher Trick ist der Aufruf der Funktion "methods", die alle Methoden auflistet, die der Instanz des Objekts zur Verfügung stehen, und die Verwendung der grep-Methode, um etwas Bestimmtes herauszufiltern. Auf diese Weise erhalten Sie auch einen guten Überblick darüber, welche Standardmethoden von Basisklassen bereitgestellt werden, ohne dass Sie die Dokumentation zu Rate ziehen müssen.

a = Array.new
=> []
>> a.methods.grep /find/
=> ["find", "find_all"]

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