Ruby 中的匿名类

Posted

技术标签:

【中文标题】Ruby 中的匿名类【英文标题】:Anonymous classes in Ruby 【发布时间】:2011-09-16 15:00:11 【问题描述】:

我有两个问题:

    方法f_1是否属于元类匿名类? 方法f_2是否属于匿名类?

相关代码如下:

car = "car"

class << car
  def self.f_1
    puts "f_1"
  end
  def f_2
    puts "f_2"
  end
end

【问题讨论】:

【参考方案1】:

由于 ruby​​ 自己的 API 使用术语“singleton class”,我会说以下是正确的:

    f_1是汽车单例类的类方法,可以这样调用:

    car.singleton_class.f_1
    

    f_2是汽车单例类的实例方法,可以这样调用:

    car.f_2
    

【讨论】:

【参考方案2】:

好吧,术语是易碎的,但 FWIW 我会说你的班级并不是真正的匿名班级。至于归属,这两种方法都只存在于汽车对象中。

老实说,当针对这样的单个对象定义类时,我对类方法和实例方法之间的区别有点模糊——我猜如果有任何区别,这将是一个晦涩难懂的代码,会使您的代码更难阅读;)

更新:如果您以前从未见过this,您可能会发现它很有帮助。 (就个人而言,这让我很头疼,但每个人都不一样......)

【讨论】:

【参考方案3】:

我的印象是匿名类是没有名字的类:

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

但是,Pickaxe 将其称为未命名类而不是匿名类。

【讨论】:

如果您创建一个类并为其分配一个常量 My_slass 它将有一个名称。【参考方案4】:

Rob Davis 的回答重新表述:

    :f_1 的方法所有者是 car.singleton_class.singleton_class:f_2 的方法所有者是car.singleton_class

carcar.singleton_classcar.singleton_class.singleton_class 对应于图表中的底行http://www.atalon.cz/rb-om/ruby-object-model/#sc-inheritance-sample。

注意事项:

代码不会创建任何新类(特别是不会创建匿名类)。 在大多数 Ruby 程序中,特征类的特征类不是“实际的”(参见 http://www.atalon.cz/rb-om/ruby-object-model/#actual-lists)。

【讨论】:

以上是关于Ruby 中的匿名类的主要内容,如果未能解决你的问题,请参考以下文章

java笔记Java中的匿名类和匿名内部类

java内部类的匿名内部类

Java中的匿名内部类及内部类的二三事

匿名类内部类匿名内部类-转

java的内部类与匿名内部类

java中的匿名内部类