ruby - 从类方法中获取类的名称

问题描述 投票:7回答:2

我试图从类的静态方法中获取类的名称。

class A
  def self.get_class_name
    self.class.name.underscore.capitalize.constantize
  end
end

虽然这个方法返回的是Class,而不是A. 有什么好办法能让我得到A吗?

最终我还想有一个继承自A的类B,它将使用相同的方法,并在调用时返回B。

我这样做的原因是,我最终在这个域下有另一个对象。A::SomeOtherClass 我想用我收到的结果来使用这个对象

ruby metaprogramming
2个回答
11
投票

移除 .class:

class A
  def self.get_class_name
    self.name.underscore.capitalize.constantize
  end
end

self 在一个类的上下文中(而不是一个实例方法的上下文),指的是类本身。

这就是为什么你写 def self.get_class_name 来定义一个类方法。这意味着添加方法 get_class_nameself (又名 A). 它相当于 def A.get_class_method.

这也是为什么当你尝试 self.class.name 你有 Class - 的 Object#classAClass.

为了更清楚地说明这一点,请考虑以下的输出。

class A
  puts "Outside: #{self}"

  def self.some_class_method
    puts "Inside class method: #{self}"
  end

  def some_instance_method
    puts "Inside instance method: #{self}"
  end
end

A.some_class_method
A.new.some_instance_method

Which is:

Outside: A
Inside class method: A
Inside instance method: #<A:0x218c8b0>

0
投票

这个的输出是:

class NiceClass
  def self.my_class_method
    puts "This is my #{name}"
  end
end

NiceClass.my_class_method

将会是:

This is my NiceClass
© www.soinside.com 2019 - 2024. All rights reserved.