7

In Javascript I could do this.

var a = {};
a.f1 = function(){};

How can I do this in Ruby?


Update.

In JS code, a is an object instantiated without class. And function(){} is an anonymous function, and a.f1 = adds the function to the object instance. So the function is bound to the instance only, and nothing is related to the class or similar definitions.

0

2 Answers 2

19

Ruby and JS's object models are very different, but a direct translation may look like this:

a = Object.new
def a.f1(x) 
  2*x
end

a.f1(5) #=> 10

You can also use the Ruby's eigenclass:

class Object
  def metaclass
    class << self; self; end
  end
end

a = Object.new    
# Also: (class << a; self; end).send(:define_method, :f1) do |x|
a.metaclass.send(:define_method, :f1) { |x| 2*x }

A warning note: you'll see this kind of code in meta-programming/monkeypatching/... but it's not usual when writing "normal" code, where other techniques (module mix-ins, mainly) apply.

Sign up to request clarification or add additional context in comments.

3 Comments

Does second one add the block code to the Object class as a instance method f1?
you don't need the metaclass stuff. just use foo.class.send(:define_method, :bar) do ... end
@Edmund, but this would add method :bar to all instances of the class, I understood the OP wanted to add it only to a specific instance.
6

There's difference between JavaScript and other languages because JavaScript does inheritance in another way. So here's couldn't be direct analogue.

Let's pretend that {} is the A class in ruby and you create object from it

class A
end

a = A.new

And f1 function seats in some module B

module B
  def f1
    puts "you've extended your object"
  end
end

Now you can do what you want in similar way

a.extend(B)

a.f1 #=> "you've extended your object"

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.