LINUX.ORG.RU

[нубство]Ruby, freeze


0

1

Добрый день, ЛОР.
Изучаю Ruby. Заинтересовался таким вопросом.
Допустим, есть у нас некий объект object.
Вызвав у него freeze, мы защитили его от изменения, то бишь не дадим сделать нечто вроде:

d = [1,2,3]
d.freeze
d << 4

Но тем не менее можем переприсовить:
d = []

А есть ли способ защитить объект от этого?

★★

Последнее исправление: eliriand (всего исправлений: 1)

Ты можешь объявить не переменную, а константу, скажем, D. Хотя это даст ворнинг только при присваивании.

Deleted
()
Ответ на: комментарий от Deleted

Если я объявлю константу, то вообще не смогу её менять. А мне, допустим, хочется заблокировать объект лишь временно или по условию. Хотя, конечно, пример несколько натянутый.

eliriand ★★
() автор топика

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

a=[1,2]
a.freeze
b=a
a=[]
b[0]=3 # error

По всей видимости тебе просто нужна константа.

smh ★★★
()
Ответ на: комментарий от smh

То, что переменная будет указывать на другой объект, понятно.
Получается, без константы никак не обойтись будет?

eliriand ★★
() автор топика
Ответ на: комментарий от eliriand

>временно

А разве разморозить потом можно было в рубях?

Возможно стоит просто сделать доступ через геттеры/сеттеры к данным. Только если отдавать объект, то надо быть осторожным, т.к. они могут быть изменены.

Deleted
()
Ответ на: комментарий от Deleted

> А разве разморозить потом можно было в рубях?

Кстати, да. Анфризить нельзя, насколько я знаю. :-)

smh ★★★
()
Ответ на: комментарий от smh

Плюсую. Только что порылся, ничего для этого не нашёл.

eliriand ★★
() автор топика

d = [1,2,3]
d.freeze
d << 4

Я руби не знаю, но сразу вопрос, а защищает ли freeze от изменений самих объектов в списке?

Т.е.

a = "FOO"
d = [1, 2, a]
d.freeze
a.toLower() 
прокатит или нет?

paranonymous
()
Ответ на: комментарий от paranonymous

Не защищает.

После a.downcase! в данном случае d станет равным [1, 2, «foo»].

Deleted
()

d - это всего лишь указатель на объект.
Что ты хочешь защитить: указатель или объект?
Если указатель, то заведи другой:

e = d
d = []
# делаешь что-то ...
d = e
А сам объект после фриза никуда не девается, как я понимаю.

Nordman
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.