При передаче объектов в качестве параметров они передаются по ссылке? - PullRequest
7 голосов
/ 30 июня 2011

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

def do_something(user, article)
...
end

против

def do_something(user_id, article_id)
  ..
end

Я предпочитаю проходить мимо объектов, так как в будущем мне могут понадобиться другие атрибуты.

Ответы [ 5 ]

16 голосов
/ 30 июня 2011

Да

Оба вызова метода занимают примерно одинаковое количество времени.

(Хорошо знать о последствиях для производительности, и вы задали разумный вопрос, но даже в этом случае стандартОтказ от ответственности 1 о ранней оптимизации технически применим.)


1.Во-первых, заставить программу работать.Затем профиль.Наконец, и, возможно, оптимизировать.
Дональд Кнут сказал: Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла.

4 голосов
/ 19 января 2012

Re: https://stackoverflow.com/a/6528257 (мне не хватало репутации, чтобы комментировать на момент написания статьи)

Ах, но Йорг, если вы на самом деле манипулируете аргументом, вместо присвоения ему нового объекта, метод ведет себя по-другому. Использование .replace вместо = дает вам следующее:

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter.replace 'Ruby is pass-by-reference.'
end

var = 'Ruby is pass-by-value.'

is_Ruby_pass_by_value_or_reference?(var)

puts var
# Ruby is pass-by-reference.

На самом деле, давайте уточним немного больше, просто чтобы показать разницу:

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter.replace 'Ruby is pass-by-reference.'
  parameter = "This assigns a whole new object to 'parameter', but not to 'var'."
  puts parameter
end

var = 'Ruby is pass-by-value.'

is_Ruby_pass_by_value_or_reference?(var)
# This assigns a whole new object to 'parameter', but not to 'var'.

puts var
# Ruby is pass-by-reference.
1 голос
/ 30 июня 2011

Нет, Ruby никогда не проходит по ссылке. Ruby передается по значению. Всегда. Без исключений.

def is_Ruby_pass_by_value_or_reference?(parameter)
  parameter = 'Ruby is pass-by-reference.'
end

var = 'Ruby is pass-by-value. Always. No exceptions.'

is_Ruby_pass_by_value_or_reference?(var)

puts var
# Ruby is pass-by-value. Always. No exceptions.

Если бы Ruby был переходом по ссылке, это вывело бы Ruby is pass-by-reference.

0 голосов
/ 30 июня 2011

Ну, в ruby ​​все равно Object (все наследуется от Object), а ruby ​​всегда передает объекты по ссылке, поэтому оба ваших примера передаются по ссылке!

0 голосов
/ 30 июня 2011

Например, я бы выбрал вариант _id. Я предпочитаю всегда быть в состоянии получить правильное состояние моих объектов. Работать со старыми никогда не бывает весело.

...