2012-05-16 2 views
6

Ich hoffe, ich wiederhole niemanden hier, aber ich habe Google und hier gesucht und habe nichts gefunden. Bei dieser Frage geht es mehr darum, meinen Code zu "sexieren".Ist es möglich, auf einen Parameter zu verweisen, der an eine Methode innerhalb des übergebenen Blocks in Ruby übergeben wird?

Was ich gesagt ich versuche ist, dies zu tun:

Dir.new('some_directory').each do |file| 
    # is there a way to refer to the string 'some_directory' via a method or variable? 
end 

Dank!

Antwort

7

Nicht im Allgemeinen; Es liegt an der Methode selbst, mit welchen Argumenten der Block aufgerufen wird, und zu der Zeit, die each aufgerufen wurde (die Ihren Block aufruft), wurde die Tatsache, dass die Zeichenfolge 'some_directory' an Dir.new übergeben wurde lange vergessen, dh sie sind ziemlich getrennte Dinge.

Sie können zwar so etwas wie dies tun:

Dir.new(my_dir = 'some_directory').each do |file| 
    puts "#{my_dir} contains #{file}" 
end 
+1

Oooo, das mag ich! Mir war nicht einmal bewusst, dass das legal war. Ich bin immer noch ein Rubin n00b. Entschuldigung, ich kann dich nicht abstimmen, ich habe noch keinen Ruf. –

+0

dh genau das habe ich gesucht. Ich habe gerade versucht, mir eine Zeile Code zu sparen und das ist es :) –

+0

:)! Es ist ein guter Weg, um Dinge kompakt zu machen, aber wie bei den meisten guten Dingen führt Überbeanspruchung zu unlesbarem Code, daher tendiere ich dazu, ihn sparsam zu verwenden oder wo es Sinn macht. (Ich denke, es macht Sinn hier.) – Ashe

2

Der Grund, warum es nicht funktioniert ist, dass new und each zwei verschiedene Methoden sind, so dass sie keinen Zugriff auf die anderen Parameter haben. Um ‚sexify‘ Code, könnte man erwägen, ein neues Verfahren zu schaffen, die beiden Methodenaufrufe zu enthalten und die wiederholten Parameter auf, dass übergeben:

def do_something(dir) 
    Dir.new(dir).each do |file| 
    # use dir in some way 
    end 
end 

Die Tatsache, dass ein neues Verfahren zu schaffen hat eine so niedrige Overhead bedeutet, es ist ganz Es ist vernünftig, einen für einen so kleinen Teil des Codes zu erstellen - und ist einer der vielen Gründe, warum Ruby so ein Vergnügen ist, mit einer Sprache zu arbeiten.

+0

kühlen; Ich hatte Angst davor. Ich weiß, dass ich einfach 'some_directory' einer Variablen zuweisen kann, aber ich habe versucht, mir eine ganze Zeile zu sparen :) Danke! –

+0

Kein Problem! :-) – Russell

+0

Whoa, offensichtlich bin ich hier bekannt, aber als ich das erste Mal geantwortet habe, zeigte es nur die erste Zeile deiner Antwort. Die Leute reagieren so schnell hier! Danke allen! –

0

Einfach in eine Variable ausbrechen. Ruby Blöcke sind Verschlüsse, so dass sie Zugriff haben werden -

dir = 'some_directory' 
Dir.new(dir).each do |file| 
    # use dir here as expected. 
end 
Verwandte Themen