Явный возврат от метода Ruby - сокрытие реализации, повторное использование и оптимизация - PullRequest
2 голосов
/ 23 декабря 2009

Вместо того, чтобы позволить методу Ruby вслепую возвращать последний оцененный оператор, есть ли какое-либо преимущество для явного возврата nil?

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

Далее, есть ли оптимизация, которую может выполнить Ruby, когда возвращаемый результат является простым типом, а не ссылкой на более сложный объект?

Chris

Ответы [ 5 ]

5 голосов
/ 23 декабря 2009

Глядя на вторую часть вопроса:

есть ли оптимизация, которую может Ruby сделать, когда возвращение является простым типом а не ссылка на более сложный объект?

... Я не думаю, что стоит беспокоиться. Если есть выигрыш в производительности (а я, скорее, сомневаюсь в этом), это в лучшем случае микрооптимизация и вряд ли принесет какую-либо выгоду, которую стоит иметь. Я подозреваю, что попытка обоих способов с require profile покажет, как мало можно получить. ; -)

1 голос
/ 23 декабря 2009

Вообще говоря, нет. Я никогда не видел функцию, которая во избежание возврата значения последнего выполненного оператора возвращает nil.
Если возвращаемое значение используется от вызывающей стороны, вы можете вернуть nil, чтобы избежать использования результата последней инструкции от вызывающей стороны. Если предполагается, что функция возвращает значение, то я думаю, что код написан неправильно, если он явно не возвращает значение.

1 голос
/ 23 декабря 2009

Если вы не планируете что-то делать с возвращаемым значением, я не вижу никаких преимуществ.

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

Кто-то исправит меня, если я ошибаюсь, но неявное возвращаемое значение не имеет никакого практического применения, кроме удобства.


Вот гипотетический сценарий, где он может быть полезен

def func
  if do_something
    # we don't want to return the return value of do_something_else, so return nil
    do_something_else
    return nil
  end
  # we do want to return the return value of this function; however.
  do_foo
end

Я считаю, что вряд ли это произойдет

0 голосов
/ 26 марта 2010

Да, есть преимущества при возврате ноль. Я бы не стал их беспокоить, если вы не пытаетесь предоставить API.

0 голосов
/ 23 декабря 2009

Обычно существует два типа методов, т. Е.

  1. Функциональные методы - возвращающие значение после запуска или вызова метода
  2. Процедурные методы - изменяющие внутреннее состояние объекта

Примером функционального метода будет

def max(num, another_num)
  num > another_num ? num : another_num
end

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

Простым примером процедурного метода могут быть сеттеры или средства доступа к атрибутам в ruby, например

class Person

  def name=(name)
    @name = name
  end

end

описанный выше метод изменяет внутреннее состояние объекта Person, т. Е. Устанавливает для переменной экземпляра @name указанное значение.

Так что все зависит от того, какой метод вы пишете, намерения вашего метода и как вы собираетесь его использовать. Другими словами, если это процедурный метод, то вы можете вернуть nil в конце, но лично я еще этого не делал, т.е. возвращать nil только при изменении состояния объекта, потому что это просто добавит строку кода и также сделает метод выглядеть сложным без добавления какого-либо значения в метод.

Тем не менее, Ruby всегда возвращает значение последнего оцененного оператора из метода, будь то процедурный или функциональный метод, который фактически делает удобным вычисление метода или некоторого условия внутри метода при некоторых обстоятельствах.

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