Size: a a a

Saint P Ruby Community

2020 July 05

TL

Tab Loid in Saint P Ruby Community
max
Как бы аппетитно этот пропосал не выглядел, он отвратителен.
Они просто сломают Struct, пусть берут новый класс типа HashWithDotAccess  и на нем экспериментируют (да, могут унаследовать от стракта). Но то что они предлагают не ведет себя как текущий стракт и поэтому не должно быть его инстансом.
Ты о чем? К тому же если они чем-то нарушают лисков, то наследование от стракта проблему не решит.
источник

m

max in Saint P Ruby Community
к тому что можно будет сделать что-то типа
`user = ${id: 1, name: 'admin'}
post = ${id: 2, name: 'post'}`
и они окажутся одного класса
не говорю уже о том еще между ними вставить
user.class_eval do def m; 1 end end
то окажется что они еще и поведение теперь шарят
инстансы Struct предполагают поведение, а там они об этом забыли
источник

VD

Vla Dem in Saint P Ruby Community
Кэширование предполагается не по набору ключей, а по лексическому контексту (типа inline cache в iseq); в примере выше будет два разных класса
источник

m

max in Saint P Ruby Community
где такое сказано? я вижу только
> Anonymous structs which have the same member in the same order share their class.
источник

m

max in Saint P Ruby Community
если будет так как вы сказали, тогда это вообще полный бред
{a: 1} == {a: 1}
${a: 1} != ${a: 1}
источник

m

max in Saint P Ruby Community
судя по Background все что надо - это доступ к элементам через .
зачем при этом порождать новые классы мне не ясно
источник

VD

Vla Dem in Saint P Ruby Community
Затем же, зачем в принципе использовать анонимные Struct 🤷🏻‍♂️
источник

TL

Tab Loid in Saint P Ruby Community
max
к тому что можно будет сделать что-то типа
`user = ${id: 1, name: 'admin'}
post = ${id: 2, name: 'post'}`
и они окажутся одного класса
не говорю уже о том еще между ними вставить
user.class_eval do def m; 1 end end
то окажется что они еще и поведение теперь шарят
инстансы Struct предполагают поведение, а там они об этом забыли
Если я проверну такой же class_eval с инстансом хэша будет же тоже самое. Я все равно не вижу в чем тут отличие от текущего стракта, никто же не запрещает сделать user и post инстансами одного стракта. Не скажу что мне нравится эта особенность, но критичного я ничего не вижу
источник

m

max in Saint P Ruby Community
анонимные Struct не кэшируются если у них совпадают члены класса и их порядок
всегда же можно сделать
Struct.new('User', :id, :name)
Struct::User.new(1, 'admin')
источник

m

max in Saint P Ruby Community
так отсюда вопрос. должны эти анонимные стракты из пропозола поддерживать поведение?
если да, то как его добавить и не убиться об кэширование, как я описал выше
если нет, то зачем делать промежуточные анонимные классы, если им нельзя добавить поведения? у всех хэшей родитель Hash, нет там никаких промежуточных суб-классов, нормально же живем
источник

m

max in Saint P Ruby Community
Tab Loid
Ты о чем? К тому же если они чем-то нарушают лисков, то наследование от стракта проблему не решит.
LSP сломан для Struct и этот пропозал не делает лучше или хуже, он все так же сломан
источник

TL

Tab Loid in Saint P Ruby Community
Стракты не должны содержать поведение, иначе почему бы просто классы не использовать. Единственное их назначение - доступ к полям через точку и запретом обращения к несуществующим полям
источник

m

max in Saint P Ruby Community
так в этом и вопрос. инстанст стракта (Struct.new('User', :id, :name) является классом, классы *могут* иметь поведение
а тут мы говорим "ой, нет, этот класс *не должен* содержать поведение" - тогда это уже не класс, тогда зачем мы делаем его классом?
я не думаю что создавать класс, который ведет себя не как класс - это хорошее решение. опять же, это нарушение LSP. все что является классом должно крякать как класс, а этот не крякает
источник

TL

Tab Loid in Saint P Ruby Community
Не пойму о чем ты. Ты предлагаешь ввести в руби что-то помимо классов и модулей?
источник

w

wi11son in Saint P Ruby Community
Dog = Struct.new(:name, :pedegree) do
 def bark!
   "Bow wow"
 end
end
источник

w

wi11son in Saint P Ruby Community
постоянно пользуюсь такой нотацией
источник

TL

Tab Loid in Saint P Ruby Community
А понял о чем вы
источник

TL

Tab Loid in Saint P Ruby Community
Но вроде как это все равно не проблема, такая конструкция нарушет lsp, но анонимные стракты это же другие классы и в них нарушения lsp уже нет =)
источник

m

max in Saint P Ruby Community
Tab Loid
Не пойму о чем ты. Ты предлагаешь ввести в руби что-то помимо классов и модулей?
я не согласен с утверждением Стракты не должны содержать поведение
он *может*, а ты утверждаешь что не должен. тогда это уже не стракт, и не класс, а что-то другое
получается что это ты предлагаешь что-то новое не-класс
источник

m

max in Saint P Ruby Community
нет, как раз в анонимных страктах и нарушется LSP
Struct.new(:a, :b).new(1,2).class.ancestors
# [#<Class:0x0000564ed6f01fb0>, Struct, Enumerable, Object, JSON::Ext::Generator::GeneratorMethods::Object, Kernel, BasicObject]
у него не должно быть в наследниках класса Struct

def my_new_struct(base: Struct) # param type of Class
 base.new('User', :id, :name)
end

но Лисков говорит что мы можем вызывать его и так (ведь Struct.new('foo', :foo, :bar) содержит Struct в наследниках)
my_new_struct(base: Struct.new('foo', :foo, :bar)
но очевидно что это сломается
источник