【问题标题】:Ruby class method and instance methodRuby 类方法和实例方法
【发布时间】:2018-05-17 00:00:53
【问题描述】:

我正在尝试调用File 上的方法。我阅读了File 的文档,并看到了method ::basename 类。我尝试了以下方法:

x = File.new("name_of_file.ext")
x::basename("name_of_file.ext")

为什么不能这样访问类方法::basename?

【问题讨论】:

  • 类方法是从类中访问的。在您的情况下,您正在寻找 File.basename(some_file_string)。
  • ...并从一个实例调用类方法basename,您将编写x.class.basename("name_of_file.ext"),如x.class #=> File。
  • 我已经通过对您的问题做出一些假设来写一个答案,但实际上,您的问题不清楚,您应该澄清它。基本上,您是在问“为什么我不能像 php 那样访问类方法 ::basename ?”答案是“因为 Ruby 是 Ruby,而不是 PHP。”
  • 仅供参考 :: 在调用方法时与 . 相同,即 o.foo 和 o::foo 相同。

标签: ruby class methods instance


【解决方案1】:

Ruby 中没有类方法。类是对象,就像 Ruby 中的任何其他对象一样。与 Ruby 中的任何其他对象一样,它们是类的实例,即类 Class。

因此,就像任何其他对象具有在其类中定义的方法一样,类也具有在其类中定义的方法。

这就是故事的一半。像::new 这样的“类方法”通常是这样的。 Class#new是Class类的实例方法,由于File是Class的实例,所以可以调用File.new。

故事的另一半是,Ruby 中的每个对象都有一个单例类,这个类是该对象的唯一实例。由于这个类只有一个实例,所以在这个单例类中定义的任何实例方法都只能在该单个对象上调用。由于类与任何其他对象一样是对象,因此它们与任何其他对象一样具有单例类,并且可以在其中定义方法。比如File::basename被定义为File的单例类的实例方法。

你不能调用x.basename 的原因很简单:File 和x 是完全不同的对象,它们是完全不同的类的实例,那么为什么会你希望能够在两者上调用相同的方法?好吧,你不会!作为不同类的实例的不同对象通常具有不同的方法。

【讨论】:

  • OP 试图通过x::basename 调用它,而不是x.basename。可能期望 :: 成为 .class. 的语法糖
  • 使用:: 发送消息是不习惯的,如果消息以大写字母开头并且不带参数列表,则会出现令人惊讶的行为,这就是我将其更改为. 的原因。不过没关系,因为在 this 示例中,它们的行为相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2014-03-06
  • 2011-11-15
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多