2009-10-28 8 views
15

Czy istnieje sposób, aby zacząć od określonej linii, np. Instrukcja goto?Czy w Ruby jest instrukcja goto?

+8

obowiązkowe xkcd komiksu: http://xkcd.com/292/ – LiraNuna

+1

żadnego konkretnego powodu chcę wiedzieć? –

+0

Wiem, że możesz w rspec. Może spojrzeć na źródło. –

Odpowiedz

25

Po pierwsze, byłoby to polecenie, a nie polecenie. Po drugie, patrz ruby-goto. Po trzecie, trzeba pamiętać

Kategoria: Library/Zła

+11

Wow, "Kategoria: Biblioteka/Zło". – LiraNuna

+3

Początkowo myślałem, że to żart, ale tak naprawdę jest Kategoria: Biblioteka/Zło. Obecnie obejmuje ruby-goto, jak wspomniano, a także * segfault4r *: "Jest to moduł, który wymusza segfault. – Colin

+0

rubo link goto jest martwy. –

2

Nie wierzę więc (i przez wszystkie świętości, że nie powinien).

Ale jest tam moduł goto, jeśli czujesz się naprawdę masochistycznie.

4

Istnieje przełącznik linii poleceń 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. 

Przysięgam, jestem prawie pewien, że rubin-goto był żartem. Nie wierzę, że link do pobrania kiedykolwiek działał. Czy powinienem po prostu wskazać ludziom to i milczeć? Nigdy nie wiem ...

lubiłem następną linię Ryana po ogłoszeniu Ruby-goto:

zaglądajcie do następnego modułu złego ... ruby-malloc! Miłego dnia.

Ryan jest ewidentnie geniuszem.

1

goto lib wciąż jest z nami: D https://rubygems.org/gems/goto/versions/0

Oszczędzanie cały gem dla potomności:

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 
Powiązane problemy