Is there goto statement in Ruby?
Is there a way to start at a specified line, like a goto state开发者_如何转开发ment?
First, it would be statement, not a command. Second, see ruby-goto. Third, note
Category: Library/Evil
There is the ruby command line switch -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.
BTW, I'm pretty sure ruby-goto was, umm, a joke. I don't believe the download link has ever worked. Or am I just supposed to point people to it and keep quiet? I never know...
I liked Ryan's next line after announcing ruby-goto:
Stay tuned for the next evil module... ruby-malloc! Have a nice day.
Ryan is clearly a genius.
The goto lib is still with us :D https://rubygems.org/gems/goto/versions/0
Conserving the entire gem for posterity:
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
I don't believe so (and, by all that's holy, it shouldn't).
But there's a goto
module for it if you're feeling really masochistic.
精彩评论