Рубиновый выпуск - PullRequest
       1

Рубиновый выпуск

2 голосов
/ 23 августа 2010

работает следующий код

def lab
  Proc.new { return "foo1" }.call
  return "foo2"
end

puts lab #=> foo1

Следующее НЕ работает. Зачем?. Я получаю LocalJumpError

class Foo
  def self.doit(p)
    p.call
  end
end

p = Proc.new {
  return 'from block' 
}

a = Foo.doit(p)

puts a #=> LocalJumpError: unexpected return

Ответы [ 3 ]

2 голосов
/ 23 августа 2010

Это разница между procs vs lambdas (поиск в Google, который даст вам больше ресурсов).

По сути, в первом случае ваш "return foo1" возвращает из лаборатории и должен находиться внутри контекста, куда возвращаться.

Вы можете добиться того, что пытаетесь сделать, используя лямбду

p = lambda { return "from block" }

Также обратите внимание, что вам обычно не нужны операторы return ни в процедурах, ни в лямбдах; они вернут последнее оцененное выражение. Итак, это эквивалентно:

p = Proc.new{ "from block" }
1 голос
/ 23 августа 2010

Если вы хотите получить выражение из процедуры, а также выполнить

p = Proc.new{ "from block" }

, как предложил Чубас, вы также можете использовать next, например

p = Proc.new do
  next "lucky" if rand < 0.5 #Useful as a guard condition
  "unlucky"
end
0 голосов
/ 23 августа 2010

Обычно во втором случае вы возвращаетесь из объекта Proc, прежде чем сделать вызов в Foo.doit (p).Поскольку p уже вернулось, p.call не к чему возвращаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...