Есть ли в Ruby оператор goto? - PullRequest
       10

Есть ли в Ruby оператор goto?

16 голосов
/ 28 октября 2009

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

Ответы [ 4 ]

28 голосов
/ 28 октября 2009

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

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

4 голосов
/ 28 октября 2009

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

Кстати, я уверен, что ruby-goto была шуткой. Я не верю, что ссылка для скачивания когда-либо работала. Или я просто должен указывать на это людям и молчать? Я никогда не знаю ...

Мне понравилась следующая строка Райана после объявления ruby-goto:

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

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

2 голосов
/ 28 октября 2009

Я не верю в это (и, несмотря на все это, 100 * * не должно ).

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

1 голос
/ 09 января 2016

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...