Comments (9)
bump :)
from dry-types.
I might add a separate issue for this, but I think that Dry::Types::Struct
objects should also change their behavior such that attribute values are duplicated upon instantiation:
require 'dry/types'
class Name < Dry::Types::Struct
attribute :first, 'strict.string'
attribute :last, 'strict.string'
end
name1 = Name.new(first: 'john', last: 'doe') # => #<Name first="john" last="doe">
name2 = Name.new(name1) # => #<Name first="john" last="doe">
name1.equal?(name2) # => false
name1.first.reverse!
name1.first # => "nhoj"
name2.first # => "john"
this way you can still have mutable structs if you want but you still aren't as likely to accidentally mutate the state of another object.
from dry-types.
I might add a separate issue for this, but I think that Dry::Types::Struct objects should also change their behavior such that attribute values are duplicated upon instantiation
We can provide a special struct type that does that if it could be useful. But I wouldn't want this to be THE behavior of every struct, because of performance cost.
from dry-types.
True, we should deeply freeze its members. It's gonna cost a lot in terms of performance though so it should be properly documented.
from dry-types.
Given the performance cost, can you imagine anyone actually wanting to use such a class?
from dry-types.
Of course, there are places where being so paranoid is a good idea, esp when you rely heavily on object's equality and you need to make sure nothing can mutate them. I had this kind of code a couple of times, I always used truly immutable objects there.
from dry-types.
It's gonna cost a lot in terms of performance though so it should be properly documented.
Assuming this is properly documented are you comfortable then with moving forward on this? I'm happy to do a PR at some point I just want to make sure that this is inline with what the project's goals
from dry-types.
Yes let's do this
from dry-types.
On it. I assume you are fine with pulling in IceNine as a dependency for this?
from dry-types.
Related Issues (20)
- Constructor is not applied properly to the result of types Sum HOT 5
- Types::Params::Integer incorrect coercion for numeric values HOT 9
- Types::Params::*.optional not handling empty string HOT 4
- Anonymous Dry::Types based module cannot be extended HOT 4
- Params namespace disapearing HOT 9
- Params coercion for Array works in an unintuitive way HOT 1
- https://dry-rb.org/gems/dry-types/ not at latest version HOT 1
- [Security] Workflow ci.yml is using vulnerable action actions/checkout
- Compound Types with Examples HOT 1
- Dry::Container::Error: There is already an item registered with the key "nominal.string" on jruby-head HOT 4
- Future-proof local override for Types::Instance/Constructor classes that potentially collide with predicates
- Unexpected error raised from Sum type HOT 7
- Types::Coeercible::Integer, should this use Base 10? HOT 2
- Add Zeitwerk autoloader
- Using transform_keys breaks error handling
- Undefined method after upgrading dependencies. HOT 5
- Missing method implementation for `Enum.each_value` HOT 1
- Types.Constructor failing on Ruby 3.1 HOT 8
- A bug with array, struct and sum of structs in `try` method
- Fix BigDemical warning
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from dry-types.