Size: a a a

Saint P Ruby Community

2020 December 07

m

max in Saint P Ruby Community
вообще самый простой пример замыкния это &block
и этот block из def m(&block) я очень даже могу потрогать
источник

TL

Tab Loid in Saint P Ruby Community
Tab Loid
Чистый руби так же считает, но почему не C?
Сообразил что в данном случае C это просто константа указывающая на A::B, но с другой стороны и A::B это константа.. В итоге C это ссылка на константу, а A::B это ссылка на модуль, puts очевидно возвращает имя модуля.
источник

m

max in Saint P Ruby Community
да всё еще веселе, есть анонимные классы... которые перестают быть анонимными, если присвоить их константе
module A
end

a = Class.new

p a.name
# > nil

A::B = a

p a.name, A::B.name
# > "A::B", "A::B"
источник

m

max in Saint P Ruby Community
Class.new
new(super_class=Object) { |mod| ... } → a_class
Creates a new anonymous (unnamed) class with the given superclass (or Object if no parameter is given). You can give a class a name by assigning the class object to a constant.
источник

m

max in Saint P Ruby Community
вопрос, тогда что такое  :: в A::B
пока в гугле больше всего ответов вида
The :: is the namespace/scope resolution operator.
но пока не нашел источник в официальной доке
источник

m

max in Saint P Ruby Community
т.е. оператор есть, а неймспейсов/скопов нет? =)
источник

CM

Cucumba Morozov in Saint P Ruby Community
max
простите, что?

a = 1
closure = ->(arg) { a = arg }

closure.call(3)

p a
> 3

можно еще книжку почитать: http://ruby-doc.com/docs/ProgrammingRuby/#UG

то что оно там через биндинг работает - это детали реализации и никого не интересует
Ну и где там какой-нибудь объект замыкания?)
источник

m

max in Saint P Ruby Community
Переменная a  замкнута лямбдой
Или что имеется в виду под "объектом замыкания"?
источник

TL

Tab Loid in Saint P Ruby Community
Еще забавный код:
a = Module.new
a::B = Module.new
puts a::B
Результат удивляет слегка
источник

TL

Tab Loid in Saint P Ruby Community
после a = A все чинится и для a::B. Есть предположение что в руби есть инфа только о дочерних элементах, но не о родительских
источник

TL

Tab Loid in Saint P Ruby Community
Реверс инженерить руби через исполнение кода всегда так забавно.. но пора спать)
источник

m

max in Saint P Ruby Community
Tab Loid
после a = A все чинится и для a::B. Есть предположение что в руби есть инфа только о дочерних элементах, но не о родительских
Очень похоже что так и есть
А для наследования ровно наоборот: есть цепочка родителей ancestors, но нет инфы о дочерних
источник

TL

Tab Loid in Saint P Ruby Community
max
Очень похоже что так и есть
А для наследования ровно наоборот: есть цепочка родителей ancestors, но нет инфы о дочерних
А как же subclasses? fix: сообразил что это ActiveSupport тоже
источник

DN

Dmitry Non in Saint P Ruby Community
Tab Loid
Еще забавный код:
a = Module.new
a::B = Module.new
puts a::B
Результат удивляет слегка
вопрос, видимо, в том, является ли a::B анонимным модулем или нет.
С одной стороны, он привязан к константе, но с другой стороны константа эта находится в анонимном модуле.

Если предположить, что внутри анонимного модуля все остается анонимным, то C = a::B логично привязывает анонимный модуль к С дальнейшие манипуляции с его надмодулем имя не изменят
источник

DN

Dmitry Non in Saint P Ruby Community
мне кажется, что это допущение вполне логичное. B - просто некий указатель внутри а. Пока а остается анонимным модулем, B невозможно резолвить как константу, следовательно, В не является на самом деле константой (а вот C и A::B уже константы for real)
источник

m

max in Saint P Ruby Community
Tab Loid
после a = A все чинится и для a::B. Есть предположение что в руби есть инфа только о дочерних элементах, но не о родительских
я где-то в доках видел, что анонимным модулям/классам имя "назначается" при присвоении константе, после чего он перестает быть анонимным и дальнейшее присвоение константе уже ничего не будет делать
источник

DN

Dmitry Non in Saint P Ruby Community
max
я где-то в доках видел, что анонимным модулям/классам имя "назначается" при присвоении константе, после чего он перестает быть анонимным и дальнейшее присвоение константе уже ничего не будет делать
так и есть
источник

DP

Di P in Saint P Ruby Community
Ребят, есть кто юзает Sequel::Model?
Понадобилось тут почистить локально все записи модельки, вызвал .destroy. А он мне говорит кажется о том что на модели есть ассоциации и пока не грохнешь ассоциации саму модель не прибью: Sequel::ForeignKeyConstraintViolation: PG::ForeignKeyViolation: ERROR:  update or delete on table "orders" violates foreign key constraint
Но там связей много, все чистить заманаешься. В доках не могу найти, может опция какая есть чтобы зависимые связи он заодно сам почистил?
источник

AN

Andrey Novikov in Saint P Ruby Community
Di P
Ребят, есть кто юзает Sequel::Model?
Понадобилось тут почистить локально все записи модельки, вызвал .destroy. А он мне говорит кажется о том что на модели есть ассоциации и пока не грохнешь ассоциации саму модель не прибью: Sequel::ForeignKeyConstraintViolation: PG::ForeignKeyViolation: ERROR:  update or delete on table "orders" violates foreign key constraint
Но там связей много, все чистить заманаешься. В доках не могу найти, может опция какая есть чтобы зависимые связи он заодно сам почистил?
Это ошибка от базы. База не даёт тебе удалить строку из таблицы, потому что на строку ссылаются по внешним ключам, а внешние ключи в базе настроены на запрещать (без каскада)
источник

IN

Ilya Nikolaevich in Saint P Ruby Community
'drop database db_name'?
источник