0

I am very new to Ruby, so I am having difficulty understanding the functionality of the code.

I have a class having a structure given below.

1. class MyClass::Container 2. def self.call 3. @containers || {} 4. end 5. 6. def self.[] namespace 7. @containers ||= Hash.new{|h, k| h[k] = new } 8. @containers[namespace] 9. end 10. 11. def add_flag name 12. self.class.attr_reader name 13. end 

Then I have another module having a structure given below.

1. module MyClass::MyFlag 2. def self.enabled? flag, value = "true", identifier: nil 3. if identifier 4. MyClass::Container[namespace].send(name).value(identifier: identifier) == value 5. else 6. MyClass::Container[namespace].send(name).value == value 7. end 8. end 9. end 

I am having a problem understanding how line no 4 & 6 are working in MyClass::MyFlag. I mean how the .send .value is working ?.

1
  • Why are you using a version of Ruby on Rails that is no longer maintained and has unpatched security vulnerabilities? Commented Mar 20, 2022 at 0:19

2 Answers 2

1
MyClass::Container[namespace] 

is an object.

.send(name) 

sends the message in name to that object. E.g.

.send(:foo) 

sends :foo to that object as if it were called like obj.foo. That expression returns another object.

.value 

sends the message :value to the object returned by .send(name), as if it were called like

.send(name).send(:value) 

And that returns another object.

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

Comments

0

Ruby is a method call language, but using the combination of respond_to? and send you can make it seem like a message passing language.

For example here is a simple method that will "send a message" to an object, if the message corresponds to a method that exists on the receiver object, the object will respond with the result of the method call. However if the method does not exist, it will simply respond with a message indicating that the message is not understood, ie the receiver does not have a matching method"

def send_msg(receiver, msg) receiver.respond_to?(msg) ? "I understood that message and my reply is #{receiver.send(msg)}" : "I don't understand that message" end 

For example a string object has a method size but does not have a method foo, so here are the results of sending these messages to a string some_string

send_msg("some_string", "size") => "I understood that message and my reply is 11" 

but sending a message that does not correspond to a method returns the following;

send_msg("some_string", "foo") => "I don't understand that message" 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.