2012-05-16 8 views
6

espero que no estoy repitiendo a nadie aquí, pero me han estado buscando en google y aquí y no dar con nada. Esta pregunta es realmente más una cuestión de "sexificar" mi código.¿Es posible hacer referencia a un parámetro pasado a un método dentro del bloque pasado en ruby?

Lo que estoy tratando específicamente que hacer es esto:

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

Gracias!

Respuesta

7

No en general; es totalmente hasta el propio método de los argumentos que el bloque se llama con, y para el momento each ha sido llamado (que se llamará al bloque), el hecho de que la cadena 'some_directory' fue aprobada para Dir.new se ha olvidado de largo, es decir, que son bastante cosas separadas

Usted puede hacer algo como esto, sin embargo:

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

¡Oooo, me gusta eso! Ni siquiera era consciente de que era legal. Sigo siendo un ruby ​​n00b. Perdón, no puedo votar por ustedes, aún no tengo reputación. –

+0

es decir, esto es exactamente lo que estaba buscando. Solo estaba tratando de salvarme UNA sola línea de código y esto es :) –

+0

:)! Es una buena manera de hacer las cosas compactas, pero como la mayoría de las cosas buenas, el uso excesivo dará lugar a un código ilegible, por lo que tiendo a usarlo con moderación o donde tenga sentido. (Creo que tiene sentido aquí.) – Ashe

2

La razón por la que no funcionará es que new y each son dos métodos diferentes, por lo que no tienen acceso a los parámetros de los demás. Para 'sexify' su código, usted podría considerar la creación de un nuevo método para contener las dos llamadas a métodos y pasar el parámetro repetida a lo siguiente:

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

El hecho de que la creación de un nuevo método tiene significa una sobrecarga tan baja que es del todo Es razonable crear uno para un fragmento de código tan pequeño como este, y es una de las muchas razones por las que Ruby se complace en un idioma.

+0

fresca; Tenía miedo de eso. Sé que puedo asignar 'algún_directorio' a una variable, pero estaba tratando de salvarme una línea completa :) ¡Gracias! –

+0

¡Ningún problema! :-) – Russell

+0

Whoa, obviamente, estoy conocía aquí, pero cuando he respondido la primera vez que sólo estaba mostrando la primera línea de la respuesta. ¡La gente responde tan rápido aquí! ¡Gracias a todos! –

0

Sólo romperlo a cabo en una variable. Los bloques de Ruby son cierres para que tengan acceso -

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