void foo (int & x) -> Ruby? Передача целых чисел по ссылке? - PullRequest
2 голосов
/ 16 апреля 2010

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

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

void swap(int &a,int &b){
  int c=b;
  b=a;
  a=c
}

Каким будет эквивалентный код рубина внутри функции ?

Ответы [ 2 ]

6 голосов
/ 16 апреля 2010

Ruby строго передается по значению. Всегда. Но иногда эти значения путинтеры.

Вот пара ссылок:

Обратите внимание, что, хотя все они говорят "Java", они действительно должны сказать "Smalltalk и его потомки", включая Java, Ruby и множество других языков.

Я думаю, что большая часть путаницы связана с двумя проблемами:

  1. Ruby передает ссылки по значению. Но слово «ссылка» в этом предложении не совпадает со словом «ссылка» в «передача по ссылке». Может быть, это яснее, когда мы устраняем неоднозначность: давайте заменим «pass-by-reference» на «pass-by-variable» и «reference» на «pointer» (обратите внимание, что это «хорошие» хорошо себя ведущие, а не «плохие» "те из C):
    • Фортран переменный
    • Ruby передается по значению, а значения, которые он передает, в основном poointers
  2. Ссылки (poointers), которые передает Ruby, указывают на изменяемые объекты. Следовательно, хотя вы не можете изменить ссылку, вы можете изменить объекты, на которые указывает ссылка. Проблема здесь в том, что Ruby (как и большинство императивных объектно-ориентированных языков) смешивает понятия идентичности, состояния и ценности. Вы можете узнать больше об этой проблеме и о том, как ее исправить здесь (обратите внимание, что, хотя они говорят «Clojure», представленные концепции универсальны и могут одинаково хорошо применяться к ОО):

Кстати: я намеренно ошибаюсь "poointers" с OO для объектной ориентации, чтобы дать понять, что я не говорю о необработанных адресах памяти, я говорю о непрозрачных ссылках на объекты (и по очевидным причинам я не хочу используйте слово «ссылка»; если вы знаете лучшее слово, которое не является ни «указателем», ни «ссылкой», я бы хотел услышать его).

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

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

def doesnt_swap(a, b)
  c = a
  a = b
  b = c
end

С другой стороны, объекты mosts являются ссылками, например для строк, так что вы можете написать

def swap_strings(a, b)
  c = a.dup
  a.replace(b)
  b.replace(c)
end

Это поменяет местамистроковые значения двух аргументов.

Целые числа являются непосредственными, поэтому нет эквивалента replace;Вы не можете написать swap_integers.

В любом случае, в Ruby вы меняете местами: a, b = b, a

...