Есть ли в Ruby специальное хранилище для возврата значения? - PullRequest
2 голосов
/ 26 апреля 2010

следующий код Ruby

def a(b,c) b+c end 

- это то же самое, что и для Python

def a(b,c): return b+c

Похоже, что у ruby ​​есть специальное хранилище (стек или что-то), в котором хранится окончательный результат оценки и возвращается значение при вызове функции.

  • Если это так, как называется стек и как я могу получить этот стек?
  • Если нет, то как работает код Ruby без возврата чего-либо?

Ответы [ 4 ]

5 голосов
/ 26 апреля 2010

Это не волшебство, Ruby просто возвращает значение, возвращаемое операцией, выполняющей в конце.

Это синктический сахар, который реализован только на уровне синтаксического анализа: оператор, который вычисляет что-то неявно, возвращает себя без какого-либо ключевого слова.

Чтобы прояснить это немного, вы можете представить оба дерева абстрактного синтаксиса из двух фрагментов: они не будут разными.

2 голосов
/ 26 апреля 2010

Я не думаю, что это стек. Окончательная оценка функции - это просто возвращаемое значение, простое и понятное. Просто твой повседневный рубиновый синтаксический сахар.

1 голос
/ 28 апреля 2010

На самом деле возврат здесь особенный, а не стандартное поведение. Рассмотрим:

def foo(ary)
  ary.each do |e|
    return true if e == 2
  end
end

Этот код на самом деле имеет более одного стекового фрейма (по крайней мере для on #foo, для Array # каждый и для анонимной функции, переданной в #each). Что делает возврат: он выполняет переход к кадру стека самой внешней лексической области, в которую он вызывается (конец foo), и возвращает заданное значение. Если вы много играете с анонимными функциями, вы обнаружите, что возврат недопустим во всех контекстах, в то время как просто возвращается последнее вычисленное значение.

Поэтому я бы рекомендовал никогда не использовать return, если он вам не нужен именно по этой причине: прерывание и возврат из текущей итерации.

1 голос
/ 26 апреля 2010

Я не вижу причин, по которым стек должен требоваться для возврата результата.Достаточно простого указателя на область памяти.Я предполагаю, что это обычно будет возвращаться в регистре, таком как EAX.

. Вы можете получить возвращаемое значение функции, присвоив значение функции переменной (или сделав что-то еще с этим).Это способ, которым это было предназначено для использования, и единственный способ, который работает.

Не возвращать что-либо действительно легко: вызываемая функция ничего не помещает в место возврата (что бы ниэто может быть), и вызывающая сторона игнорирует это.

...