How do I call a method that is a hash value?

前端 未结 7 793
后悔当初
后悔当初 2021-01-07 02:47

Previously, I asked about a clever way to execute a method on a given condition \"Ruby a clever way to execute a function on a condition.\"

The solutions and respons

7条回答
  •  无人及你
    2021-01-07 03:23

    First of all, you are not putting a lambda in the hash. You're putting the result of calling a() in the current context.

    Given this information, consider what the code in your class means. The context of a class definition is the class. So you define an instance method called a, and assign a class instance variable to the a hash containing the result of calling a in the current context. The current context is the class A, and class A does not have a class method called a, so you're trying to put the result of a nonexistent method there. Then in the instance method b, you try to access an instance variable called @a -- but there isn't one. The @a defined in the class context belongs to the class itself, not any particular instance.

    So first of all, if you want a lambda, you need to make a lambda. Second, you need to be clear about the difference between a class and an instance of that class.

    If you want to make a list of method names to be called on certain conditions, you can do it like this:

    class A
      def self.conditions() { 0 => :a } end
    
      def a
        puts "Hello!"
      end
    
      def b(arg)
        send self.class.conditions[arg]
      end
    end
    

    This defines the conditions hash as a method of the class (making it easy to access), and the hash merely contains the name of the method to call rather than a lambda or anything like that. So when you call b(0), it sends itself the message contained in A.conditions[0], which is a.

提交回复
热议问题