Skip to content

Conversation

@PeterLanglois
Copy link

Problem

The add_operation is manipulating the Object class.
It can add new methods to object as well as overwrite existing methods.

Object.sum
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-2.6.7/lib/ruby/gems/2.6.0/gems/irb-1.0.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):40
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.add_operation('sum', ->(v, _d) { v.sum })
Object.sum([1,2,3], {}) 
# 6

Solution

Replace define_method with define_singleton_method.

Object.sum
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):2:in `<main>'
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.add_operation('sum', ->(v, _d) { v.sum })
Object.sum([1,2,3], {})
# Traceback (most recent call last):
#         4: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `<main>'
#         3: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/bin/irb:23:in `load'
#         2: from /Users/peterlanglois/.rvm/rubies/ruby-3.0.0/lib/ruby/gems/3.0.0/gems/irb-1.3.0/exe/irb:11:in `<top (required)>'
#         1: from (irb):4:in `<main>'
# NoMethodError (undefined method `sum' for Object:Class)
JSONLogic.apply({ sum: [1,2,3] }, {})
# 6

['filter', 'some', 'all', 'none', 'in', 'map', 'reduce'].include?(operator.to_s)
end

def self.add_operation(operator, function)
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Didn't seem like this was doing anything, so I took it out.
Happy to add it back if desired.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants