Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переменные, непонятное поведение 
:(
    Опции темы
MystDeim
Дата 17.6.2010, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 22.10.2007
Где: Россия->Юбилей ный

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



Есть такой код:
Код

#1
a = b = 'aaa'
puts b.inspect
a[0] = 'b'
puts b.inspect

#1
a = b = 'aaa'
puts a.inspect
b[0] = 'b'
puts a.inspect


И первый и второй блоки выводят:
Код

"aaa"
"baa"

Я знаю что в руби является всё объектами, но получается что в 1 случае b ссылается на a, а во втором наоборт?

Теперь попробуем с числами:
Код

#3
a = b = 100
puts b.inspect
a = 1
puts b.inspect

#4
a = b = 100
puts a.inspect
b = 1
puts a.inspect


И в 3 и в 4 случае всё одинаково:
Код

100
100

Почему так? должно во второй раз должно же быть 1...
--------------------
Учебные материалы для студентов http://studlab.org
PM MAIL WWW   Вверх
shine
Дата 17.6.2010, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



И у чисел и у строк в Ruby есть полезный атрибут object_id. Советую поэкспериментирвать с ним до и во время ваших опытов.
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
MystDeim
Дата 17.6.2010, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 22.10.2007
Где: Россия->Юбилей ный

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



У чисел object_id всегда оказывается разный, получается ведут себя как обычные скалярные типы.

А у строк object_id одинаковый, еще проверил массивы, тоже самое.
--------------------
Учебные материалы для студентов http://studlab.org
PM MAIL WWW   Вверх
shine
Дата 17.6.2010, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вобщем, большинство переменных в руби - ссылки. Когда вы создаете переменные 'a = b = "some text"' вы создаете переменную b и присваиваете ей значение "some text". После этого вы создаете еще одну переменную a и присваиваете ей значение b которое является ссылкой на "some text". В результате вы получаете две ссылки на один объект(object_id) в памяти.
Если вы после этого присвоете a какое-то другое значение эта связь с b пропадет и вы сможете менять переменные независимо друг от друга.
Если вы хотите создать две "истинно независимые" переменные с одинаковыми значениями вы можете использовать метод clone любого объекта:
Код

a = "some text"
b = a.clone # или просто b = "some text"

После этого a и b будут указывать на разные объекты в памяти.

Но создателям языка такая схема показалась слишком простой и они оторвались на целочисленных smile Во-первых есть два типа целочисленных Fixnum и Bignum. Bignum для больших чисел а Fixnum для маленьких. Они взаимно превращаются друг в друга когда значение переменной становится слишком большим (или маленьким).
Но этого оказалось мало. Создатели языка решили прооптимизировать числа и сделали из них Singleton-ы. Каждое число - отдельный объект в памяти и все переменные с одинаковым целочисленным значением ссылаются на один и тот же объект в памяти. Само собой для этих Singleton-ов не работает метод clone по самой природе этих переменных.

Вот такие дела. Страшно?  smile 

--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
niksan
Дата 18.6.2010, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 25
Регистрация: 13.9.2009
Где: Воронеж

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



hine, очень увлекательно, спасибо ) Расскажите еще чего нить "эдакого", если не сложно ))
Или статейку подобную на хабр наваяйте, думаю, все почитают с удовольствием.

Это сообщение отредактировал(а) niksan - 18.6.2010, 07:57
PM MAIL WWW ICQ   Вверх
MystDeim
Дата 18.6.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 22.10.2007
Где: Россия->Юбилей ный

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



shine, Хотел сделать еще один эксперимент, но прочитал ваш пост еще раз внимательно и всё встало на места smile  Спасибо!

Посоветуйте почитать чего-нибуль про такие тонкости, 
Цитата

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

P.S.
Цитата

Вот такие дела. Страшно? 

Да... с руби шутки плохи!  smile 
--------------------
Учебные материалы для студентов http://studlab.org
PM MAIL WWW   Вверх
shine
Дата 18.6.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(MystDeim @ 18.6.2010,  12:22)
Посоветуйте почитать чего-нибуль про такие тонкости

Посоветовать что-то сложно т.к. в рунете толковых материалов по руби нет. Если нет проблем с английским и есть возможность немного заплатить то могу посоветовать серию видеокастов Дэйва Томаса. Там он рассказывает о внутреннем строении классов, модулей в руби, о наследовании и метапрограммировании. Вобщем весьма полезная информация.
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

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

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


 




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


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

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