代码之家  ›  专栏  ›  技术社区  ›  JP Richardson

类方法来“知道”Ruby中的类名?

  •  14
  • JP Richardson  · 技术社区  · 14 年前

    我希望继承的Ruby类通过类方法“知道”其类名。这最好用一个人为的例子来说明:

    class Parent
      def self.whoami
        ??
      end
    end
    
    class Child < Parent
      #No code should be needed.
    end
    

    所以我可以打电话给:

    Parent.whomai
    

    期待“家长”的回归,然后我可以打电话给:

    Child.whoami
    

    期待“孩子”的回归,我有一种感觉,在传统语言中,这可能是不可能的。但是Ruby的元编程模型以前让我很惊讶。有什么想法吗?事先谢谢。

    4 回复  |  直到 8 年前
        1
  •  20
  •   horseyguy    14 年前

    类方法是一种方法,其中类是接收者,因此要查找调用该方法的对象(您在这里似乎正在尝试执行的操作),只需检查 self .

    class Parent
      def self.whoami
        self
      end
    end
    
    class Child < Parent
    end
    
    puts Parent.whoami #=> Parent
    puts Child.whoami #=> Child
    
        2
  •  15
  •   Adobe    8 年前

    获取类(实际上是模块)名称的方法只是 Module#name . 不需要自己写:

    Parent.name # => 'Parent'
    Child.name  # => 'Child'
    

    然而,在Ruby中,实际上没有“类名”这样的东西,就像在其他一些语言中一样。在Ruby中,类只是一个对象,就像任何其他对象一样,它被分配给变量,就像任何其他变量一样。

    所有的 模块名 方法是循环访问系统中的所有常量,并检查模块是否已分配给其中任何一个常量,并返回该常量的名称或 nil 如果找不到。

    所以,就像其他对象一样,类的“名称”是 真正地 除了你用来引用它的任何变量之外,什么都没有。

    例子:

    foo = Class.new
    foo.name # => nil
    

    现在,该类的“名称”是 foo . 然而, 模块名 收益率 ,因为 不是常量。

    bar = foo
    bar.name # => nil
    

    现在,该类的“名称”是 二者都 bar 但是 模块名 显然还是会回来 .

    BAZ = foo
    foo.name # => 'BAZ'
    

    现在,由于类被分配给一个常量,该常量的名称将被视为该类的名称…

    BAZ = nil
    foo.name # => 'BAZ'
    

    …即使常量被分配到不同的对象上…

    QUX = foo
    QUX.name # => 'BAZ'
    

    …甚至在类被分配到另一个常量之后。

    Module#to_s 使用 模块名 如果不是 因此,要打印类的名称,只需

    puts Parent
    

    在其他答案中,完全不需要所有复杂的绒毛。

        3
  •  2
  •   Adam Lassek    14 年前

    这不是什么 Parent.class 会告诉你吗?

    class Parent
      def self.whoami
        self.to_s
      end
    end
    
    class Child < Parent
    end
    
    > Parent.whoami
    => "Parent"
    > Child.whoami
    => "Child"
    
        4
  •  1
  •   Taimoor Changaiz    11 年前

    假设你上课:

    class ABC
     def self.some_method
       self.name #it will return 'ABC'
       self.name.constantize #it will return ABC
     end
    end