2010-02-11 7 views
9

No conozco la terminología correcta. Intenté googlearlo y no pude encontrar nada por ese motivo.Reescribe la función simple de ruby ​​para usar un bloque

estoy escribiendo una biblioteca de Ruby, y quiero volver a escribir las funciones por lo que funcionan de la siguiente manera, como yo prefiero que para facilitar la lectura (dentro de un bloque?)

Tengo una función que hace esto

@dwg = Dwg.new("test.dwg") 
@dwg.line([0,0,0],[1,1,0]) 
@dwg.save 

quiero volver a escribir por lo que funciona como esto

Dwg.new("test.dwg") do 

    line([0,0,0],[1,1,0]) 
    save 

end 

¿puede usted describir la forma en que voy con esto?

+1

Un método llamado 'guardar' puede ser útil si está no usa un bloque, pero ¿no es redundante si está usando un bloque? –

+0

buen punto, sobre todo porque estoy pasando el nombre del archivo a la función – ADAM

Respuesta

15

Puede definir inicializador Dwg 's de tomar un bloque, y luego ceder a ese bloque con instance_eval, así:

class MyClass 
    def initialize(name, &block) 
    @name = name 
    instance_eval &block 
    end 

    def show_name 
    puts 'My name is ' + @name 
    end 
end 

MyClass.new('mud') do 
    show_name 
end 

# >> My name is mud 

Para obtener más información, consulte la sección 'Bloques de interfaz Simplificación' sección en el recientemente Creative Commons licencia Chapter 2 del excelente libro Ruby Best Practices de Gregory Brown. (Su autor y editor están reduciendo gradualmente todo, pero por supuesto todavía puede comprar una copia para respaldar el trabajo. La edición de iPhone es particularmente asequible.)

+0

gracias, ¡perfecto! – ADAM

+11

Asegúrate de cambiar la línea 'instance_eval & block' a' instance_eval & block if block_given? 'Si aún deseas admitir el caso en el que se llama a' new' sin un bloque, de lo contrario obtendrás 'ArgumentError: block not supplied' cuando hacer. – mikej

Cuestiones relacionadas