Поиск:

Ответ в темуСоздание новой темы Создание опроса
> передача парметров, как происходит 
V
    Опции темы
wpp
Дата 8.4.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 25.5.2003

Репутация: нет
Всего: нет



Что-то не пойму, (в документации ничего не нашел) как передаются параметры в методы? По ссылке или по значению? Или оба способа? Ткните, пожалуйста в документацию, где это описано.
PM   Вверх
skalex
Дата 9.4.2006, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 5
Всего: 23



PM   Вверх
skalex
Дата 9.4.2006, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 5
Всего: 23



Вот еще по ссылка по теме: http://www.ruby-forum.com/topic/41160#8084
PM   Вверх
Pete
Дата 9.4.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 2
Всего: 12



Методы, заканчивающиеся символом "!", изменяют объект. А вообще аргументы передаются по значению.


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Rubynovich
Дата 7.6.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 7.6.2006

Репутация: 3
Всего: 3



Цитата(Pete @ 9.4.2006,  21:36)
Методы, заканчивающиеся символом "!", изменяют объект. А вообще аргументы передаются по значению.

Всегда по значению, а методы ! лучше не использовать. Поверьте старому еврею...  "некошерные" они! 
PM MAIL   Вверх
Pete
Дата 9.6.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 2
Всего: 12



Цитата(Rubynovich @  7.6.2006,  20:08 Найти цитируемый пост)
...лучше не использовать...

Здорово еще раз!
Твои аргументы? 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
simanyay
Дата 9.6.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Антон Ковалёв
****


Профиль
Группа: Участник
Сообщений: 2053
Регистрация: 22.8.2002

Репутация: 6
Всего: 36



Цитата

Всегда по значению, а методы ! лучше не использовать.


Это типа мне ActiveRecord::Base.save! нельзя использовать? smile Или Hash.merge!? Ничего такого в этих методах, просто восклицательный знак обозначает то, что они изменяют состояние вызывающего объекта. А в отношении ActiveRecord::Base.save! означает то, что при ошибке он выкинет исключение, а не просто вернет false.

«не верьте мне, голубчик, я недостаточно пожил на этом свете» Рома Воронежский.  

Это сообщение отредактировал(а) Cr@$h - 9.6.2006, 17:36


--------------------
«It's better to be a pirate than to join the Navy» — Steve Jobs.
PM MAIL WWW   Вверх
Rubynovich
Дата 9.6.2006, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 7.6.2006

Репутация: 3
Всего: 3



Цитата(Pete @ 9.6.2006,  16:32)
Цитата(Rubynovich @  7.6.2006,  20:08 Найти цитируемый пост)
...лучше не использовать...

Здорово еще раз!
Твои аргументы?



Шалом, когда идет связка методов типа:
Код

maccuB.find_all!{ |i| i < 5 }.join


То их использование будет только мешать, т.к. значение, которое вернул .join ты не получишь, а исковеркать массив уже исковеркал, причем ненужными данными.

Использовать методы ! можно только тогда, когда нет связки (один метод) и необходимо присваивание. По своему опыту могу сказать, что вероятность такого случая стремиться к 0 (не в RoR). =)  

Это сообщение отредактировал(а) Rubynovich - 9.6.2006, 22:29
PM MAIL   Вверх
Pete
Дата 9.6.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 2
Всего: 12



Цитата(Rubynovich @  9.6.2006,  22:27 Найти цитируемый пост)
maccuB.find_all!{ |i| i < 5 }.join

Не, до таких извратов дело не доходило... 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
Rubynovich
Дата 9.6.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 7.6.2006

Репутация: 3
Всего: 3



Цитата(Pete @ 9.6.2006,  22:39)
Цитата(Rubynovich @  9.6.2006,  22:27 Найти цитируемый пост)
maccuB.find_all!{ |i| i < 5 }.join

Не, до таких извратов дело не доходило...

Дойдет, и еще не до таких... вот кусок моей сегодняшней программы:
Код

Dir['~book/super/*.html'].inject(""){ |res,file_name|
    res + [ [/<br( \/)?>/,"\n"],[/\s+/,' '] ].inject( IO.read( file_name ) ){ |result, array|
        result.gsub( *array )
    } + "\n\n"
}.display( File.open('~book/result.html','w+') )
  

Это сообщение отредактировал(а) Rubynovich - 9.6.2006, 22:50
PM MAIL   Вверх
Vanoha
Дата 30.6.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 30.6.2006
Где: Киев

Репутация: 1
Всего: 1



Параметры в методы передаются не по значению, а как ОБЪЕКТЫ!!!

Иллюстрирующий пример:
Цитата
def inc(var)
  var.succ!
end
s='aaa'  # => 'aaa'
inc(a)   # => 'aab'
a  # => 'aab'

В большинстве случаев это выглядит, как передача значения из-за следующего:
в Ruby любая операция над объектом (кроме специальных "деструктивных" методов с '!') приводит не к модификации объекта, а к созданию новой копии этого объекта  (не нового экземпляра этого класса, а именно новой копии объекта).
Поэтому, если мы делаем что-то внутри метода над объектом, то получаем новый объект, а старый не модифицируем. При этом переменная из контектста вызова остается неизменной, т.к. она "именует" "старый" объект.

Исключением являются Fixnum, Float, nil/false/true в силу специфики хранения и обработки (Float и Fixnum хранятся и обрабатывается вместе с "именем", а nil/false/true - вообще не имеют "экземпляров" как таковых).

Именно поэтому в большинстве случаев все выглядит так, как если бы в метод передавалось значение (если не используются специальные методы изменяющие сам объект [с '!']).

ID объекта в Ruby уникальны независимо от контекста, поэтому можете придумать свою проверку с использованием object_id, например:
Цитата
def test(val)
  val
end

s='djhsajdh'
s.object_id==test(s).object_id  # => true

Передача параметров в виде объекта дает следующие преимущества/функциональность:
1. нет копирования данных при вызове, что при сложных структурах дает выигрыш по скорости.
2. проще работать с уникальными методами объектов
3. просто работают методы, возвращающие/устанавливающие значения переменных объекта (ala "@var). 

Еще один пример, иллюстрирующий "подводные камни".
Цитата
def test(n)
  n[3]='qw'
end

a=[1,2,3,4]  # => [1,2,3,4]
test(a)  # => 'qw'
a   # => [1,2,3,'qw']

 

Это сообщение отредактировал(а) Vanoha - 30.6.2006, 13:12
PM MAIL   Вверх
V.A.KeRneL
  Дата 4.12.2006, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 1
Всего: 14



Цитата(Vanoha @ 30.6.2006,  09:33)
Параметры в методы передаются не по значению, а как ОБЪЕКТЫ!!!

Правильно! Спасибо, Vanoha. Хоть один внимательный участник нашёлся. Значит не пропадём! smile 
Фактические аргументы передаются в метод (и замещают тем самым формальные параметры) как объекты, т.е. ПО ССЫЛКЕ, а не по значению!


Это сообщение отредактировал(а) V_A_KeRneL - 18.12.2006, 01:40


--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Pete
Дата 4.12.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 2
Всего: 12



Цитата(V_A_KeRneL @  4.12.2006,  07:04 Найти цитируемый пост)
Фактические аргументы передаются в метод (и замещают тем самым формальные параметры) как объекты, т.е. ПО ССЫЛКЕ, а не по значению!


Все правы. Просто одни имели в виду базовые классы для работы с числами (Numeric), а другие -- сложные объекты (строки, массивы и т.п.). В этом плане ruby не отличается от С.


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
V.A.KeRneL
Дата 9.12.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: 1
Всего: 14



Цитата(Pete @  9.6.2006, 22:39 Найти цитируемый пост)

Цитата(Rubynovich @  9.6.2006,  22:27 Найти цитируемый пост)
maccuB.find_all!{ |i| i < 5 }.join

Не, до таких извратов дело не доходило...


А зря!.. Извращаться полезно! Не слушать доводы о том, что так делать низя, а надо всегда вот эдак, недвусмысленно советовал сам Бьерн Страуструп в книжке «Язык программирования C++». Хотя бы потому, что лучше запомнишь, если на собственной шкуре это испытаешь. Вот ты (Можно я на «ты», Петь? smile) не достаточно извращался, т.е. экспериментировал с Ruby и теперь не заметил, что Rubynovich привёл в качестве примера метод, которого нет ни в ядре, ни в стандартной библиотеке Рубина.
find_all есть в модуле Enumerable: http://www.ruby-doc.org/core/classes/Enume...rc/M003160.html
А find_all! нету: http://www.ruby-doc.org/core/



--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Pete
Дата 10.12.2006, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 318
Регистрация: 5.1.2006
Где: Москва

Репутация: 2
Всего: 12



Цитата(V_A_KeRneL @  10.12.2006,  00:23 Найти цитируемый пост)
Можно я на «ты», Петь?

 smile 
Цитата(V_A_KeRneL @  10.12.2006,  00:23 Найти цитируемый пост)
Не слушать доводы о том, что так делать низя

Даже если речь идет о goto (кстати, со слов того же Страуструпа)?! Не, спасибо, я уже это проходил.  smile 
Цитата(V_A_KeRneL @  10.12.2006,  00:23 Найти цитируемый пост)
не достаточно извращался

Мне сейчас гораздо важнее и интереснее освоить разные алгоритмы, а не особенности языка (си не в счет)... Жаль, р-форум не пашет, здесь есть ссылки на некоторые диалоги. Помнится, кто-то из нашего общего с тобой начальства ( smile ) говорил много интересного по данному поводу. В частности, то, что главное в решении задачи не безупречное знание синтаксиса языка, а умение работать с алгоритмами и математикой применительно к своей проблеме.

Хотя, конечно, в перспескиве......
 smile 


--------------------
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи... (Препод)
Жахни, Пендальф! © Гоблин
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.