2009-10-28 17 views
15

Gibt es eine Möglichkeit, bei einer bestimmten Zeile zu beginnen, wie eine goto-Anweisung?Gibt es eine Anweisung in Ruby?

+8

obligatorisch xkcd Comic: http://xkcd.com/292/ – LiraNuna

+1

Irgendwelche Sie besonderen Grund will wissen? –

+0

Ich weiß, Sie können in Rspec. Könnte die Quelle anschauen. –

Antwort

25

Erstens wäre es Anweisung, kein Befehl. Zweitens, siehe ruby-goto. Drittens beachten

Kategorie: Library/Böse

+11

Wow, "Kategorie: Bibliothek/Böse". – LiraNuna

+3

Zuerst dachte ich, das wäre ein Witz, aber da ist eigentlich eine Kategorie: Library/Evil. Es enthält derzeit ruby-goto wie erwähnt, sowie * segfault4r *: "Es ist ein Modul, das einen segfault erzwingt. – Colin

+0

ruby ​​goto link is dead. –

2

Ich glaube nicht so (und durch alles, was heilig ist, es sollte nicht).

Aber es gibt ein goto Modul für Sie, wenn Sie wirklich masochistisch fühlen.

4

Es ist der Ruby-Befehlszeilenschalter -x.

BTW, ich bin mir ziemlich sicher ruby-goto war, ähm, ein Witz. Ich glaube nicht, dass der Download-Link jemals funktioniert hat. Oder soll ich die Leute nur darauf hinweisen und schweigen? Ich weiß ja nie ...

ich Ryans nächste Zeile mochte nach der Ankündigung rubin goto:

Aufenthalt für das nächste Übel Modul abgestimmt ... rubin malloc! Einen schönen Tag noch.

Ryan ist eindeutig ein Genie.

1

Die goto-lib ist immer noch bei uns: D https://rubygems.org/gems/goto/versions/0

die gesamte Juwel für die Nachwelt Einsparen:

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 
Verwandte Themen