Есть ли инструкция goto в Ruby?

Есть ли способ начать работу с указанной строкой, как инструкция goto?

Ответы

Ответ 1

Во-первых, это будет оператор, а не команда. Во-вторых, см. ruby-goto. В-третьих, обратите внимание

Категория: Библиотека/Зло

Ответ 2

Имеется переключатель командной строки 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:

Оставайтесь с нами для следующего злого модуля... рубиново-таНос! Приятного дня.

Райан явно гений.

Ответ 3

Я так не верю (и, несмотря на это святое, это не должно быть).

Но там есть goto модуль, если вы чувствуете себя действительно мазохистом.

Ответ 4

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

Ответ 5

Хотя я признаю, что команды goto, как правило, являются плохой идеей, поскольку они нарушают дисциплинированный путь через алгоритм, я вижу момент, когда он очень полезен. Таким образом, в ответ на вопрос, поднятый Томом Смитом над одним из сценариев, он был бы очень полезен при отладке сценария ruby, и вы хотите перепрыгнуть через кусок кода, не удаляя код или не комментируя его.