What does def `self.function` name mean?

后端 未结 3 1628
轻奢々
轻奢々 2020-12-04 15:05

Can anyone explain to me what the meaning of adding self to the method definition is? Is it similar to the this keyword in java?

相关标签:
3条回答
  • 2020-12-04 15:48

    In ruby self is somewhat similar to this in java, but when it comes to classes its more like the keyword static in java. A short example:

    class A 
      # class method 
      def self.c_method
        true
      end
      # instance method
      def i_method
        true
      end
    end
    
    A.c_method #=> true
    A.i_method #=> failure
    A.new.i_method #=> true
    A.new.c_method #=> failure
    

    Update: Difference between static methods in java and class methods in ruby

    Static methods in Java have two distinct features that makes them different from instance methods: a) they are static, b) they are not associated with an instance. (IOW: they really aren't like methods at all, they are just procedures.) In Ruby, all methods are dynamic, and all methods are associated with an instance. In fact, unlike Java where there are three different kinds of "methods" (instance methods, static methods and constructors), there is only one kind of method in Ruby: instance methods. So, no: static methods in Java are completely unlike methods in Ruby. – Jörg W Mittag 1 hour ago

    0 讨论(0)
  • 2020-12-04 15:53

    When declaring a method, the self of the declaration is the declaring class/module, so effectively you are defining a class method. For the client, this works similar to a static method in java. The client would call the method on the class instead of an instance: MyClass.method

    Here you can find some more details on class and instance methods.

    EDIT: While the self keyword is akin to the this keyword in java, the effects of using self for class method declaration are similar to the effect of using the static keyword in java. The similarity is that static methods in java, like class methods in ruby are accessed using the class object iself instead of an instance of the class.

    Please note that static does not stand for the opposite of dynamic. The choice of the name for this keyword is questionable (probably inherited from C) and rather should have been called perClass or similar to better reflect the meaning. The technical meaning is that all static members exist only once for each classloader.

    0 讨论(0)
  • 2020-12-04 16:00

    Contrary to other languages, Ruby has no class methods, but it has singleton methods attached to a particular object.

    cat = String.new("cat")
    def cat.speak
        'miaow'
    end
    cat.speak #=> "miaow" 
    cat.singleton_methods #=> ["speak"] 
    

    def cat.speak creates a singleton method attached to the object cat.

    When you write class A, it is equivalent to A = Class.new :

    A = Class.new
    def A.speak
        "I'm class A"
    end
    A.speak #=> "I'm class A" 
    A.singleton_methods #=> ["speak"] 
    

    def A.speak creates a singleton method attached to the object A. We call it a class method of class A.

    When you write

    class A
        def self.c_method
            'in A#c_method'
        end
    end
    

    you create an instance of Class(*). Inside the class definition, Ruby sets self to this new instance of Class, which has been assigned to the constant A. Thus def self.c_method is equivalent to def cat.speak, that is to say you define a singleton method attached to the object self, which is currently the class A.

    Now the class A has two singleton methods, that we commonly call class methods.

    A.singleton_methods
     => ["c_method", "speak"] 
    

    (*) technically, in this case where A has already been created by A = Class.new, class A reopens the existing class. That's why we have two singleton methods at the end. But in the usual case where it is the first definition of a class, it means Class.new.

    0 讨论(0)
提交回复
热议问题