Ответ 1
Во-первых, это будет оператор, а не команда. Во-вторых, см. ruby-goto. В-третьих, обратите внимание
Категория: Библиотека/Зло
Есть ли способ начать работу с указанной строкой, как инструкция goto?
Во-первых, это будет оператор, а не команда. Во-вторых, см. ruby-goto. В-третьих, обратите внимание
Категория: Библиотека/Зло
Имеется переключатель командной строки 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.
Кстати, я уверен, что руби-гото был, ммм, шуткой. Я не верю, что ссылка на скачивание когда-либо работала. Или я просто должен указать людям на это и молчать? Я никогда не знаю...
Мне понравилась следующая строка Ryan после объявления ruby-goto:
Оставайтесь с нами для следующего злого модуля... рубиново-таНос! Приятного дня.
Райан явно гений.
Я так не верю (и, несмотря на это святое, это не должно быть).
Но там есть goto
модуль, если вы чувствуете себя действительно мазохистом.
goto lib все еще с нами: D https://rubygems.org/gems/goto/versions/0
Сохранение всего драгоценного камня для потомков:
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
Хотя я признаю, что команды goto, как правило, являются плохой идеей, поскольку они нарушают дисциплинированный путь через алгоритм, я вижу момент, когда он очень полезен. Таким образом, в ответ на вопрос, поднятый Томом Смитом над одним из сценариев, он был бы очень полезен при отладке сценария ruby, и вы хотите перепрыгнуть через кусок кода, не удаляя код или не комментируя его.