2009-10-28 26 views
15

¿Hay alguna manera de comenzar en una línea específica, como una declaración goto?¿Hay una declaración de goto en Ruby?

+8

obligatoria xkcd cómica: http://xkcd.com/292/ – LiraNuna

+1

alguna razón en particular que ¿quieren saber? –

+0

Sé que puede en rspec. Podría mirar la fuente. –

Respuesta

25

En primer lugar, sería una declaración, no un comando. Segundo, vea ruby-goto. En tercer lugar, tenga en cuenta

Categoría: Biblioteca/Mal

+11

Wow, "Categoría: Biblioteca/Mal". – LiraNuna

+3

Al principio pensé que esto era una broma, pero en realidad hay una Categoría: Biblioteca/Mal. Actualmente incluye ruby-goto como se mencionó, así como * segfault4r *: "Es un módulo que fuerza una segfault. – Colin

+0

ruby ​​goto link is dead. –

2

Yo no lo creo (y, por todo lo sagrado, que no debería ).

Pero hay un módulo goto si te sientes realmente masoquista.

4

Existe el interruptor de línea de comando ruby ​​-x.

 
-x[directory] Tells Ruby that the script is embedded in a message. 
       Leading garbage will be discarded until the first that 
       starts with “#!” and contains the string, “ruby”. Any 
       meaningful switches on that line will applied. The end of 
       script must be specified with either EOF, ^D (control-D), 
       ^Z (control-Z), or reserved word __END__. If the direc‐ 
       tory name is specified, Ruby will switch to that directory 
       before executing script. 

Por cierto, estoy bastante seguro de que ruby-goto era, umm, una broma. No creo que el enlace de descarga haya funcionado alguna vez. ¿O se supone que debo señalarle a la gente y guardar silencio? Nunca sé ...

me gustó siguiente línea de Ryan después de anunciar rubí-goto:

Manténgase en sintonía para el siguiente módulo mal ... rubí malloc! Que tengas un buen día.

Ryan es claramente un genio.

1

El Goto lib sigue con nosotros: D https://rubygems.org/gems/goto/versions/0

La conservación de toda la gema para la posteridad:

STACK = [] 

class Label 
    attr_accessor :name; 
    attr_accessor :block; 

    def initialize(name, block); 
    @name = name 
    @block = block 
    end 

    def ==(sym) 
    @name == sym 
    end 
end 

class Goto < Exception; 
    attr_accessor :label 
    def initialize(label); @label = label; end 
end 

def label(sym, &block) 
    STACK.last << Label.new(sym, block) 
end 

def frame_start 
    STACK << [] 
end 

def frame_end 
    frame = STACK.pop 
    idx = 0 

    begin 
    for i in (idx...frame.size) 
     frame[i].block.call if frame[i].block 
    end 
    rescue Goto => g 
    idx = frame.index(g.label) 
    retry 
    end 
end 

def goto(label) 
    raise Goto.new(label) 
end 
Cuestiones relacionadas