【问题标题】:ruby - get name of class from class methodruby - 从类方法中获取类的名称
【发布时间】:2015-07-06 13:11:54
【问题描述】:

我正在尝试从类中的静态方法中获取类的名称:

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

虽然这会返回 Class 而不是 A。关于如何获得 A 的任何想法?

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

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

【问题讨论】:

  • 该方法是否应该返回一个字符串,即"A"
  • @Stefan,我认为他只是想了解如何在类方法中获取当前类名。这可能只是一个例子。
  • 你想要班级A还是名字(字符串)"A"
  • Ruby 中的常量化是什么?
  • @DanBenjamin 在类方法中,self 返回类对象,name 返回类名。

标签: ruby metaprogramming


【解决方案1】:

删除.class

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

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

这就是你写def self.get_class_name 来定义类方法的原因。这意味着将方法get_class_name 添加到self(又名A)。相当于def A.get_class_method

这也是为什么当您尝试self.class.name 时会得到Class - AObject#classClass

为了更清楚,请考虑以下输出:

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

这是:

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

【讨论】:

    【解决方案2】:

    这个的输出:

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

    将是:

    This is my NiceClass
    

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 2016-11-02
      • 2015-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多