ruby – 为什么可以在没有父类实例的情况下调用某些类和或方法?

ruby – 为什么可以在没有父类实例的情况下调用某些类和或方法?,第1张

概述我接近Code Academy中 Ruby轨道的终点,我对一个特殊的东西感到好奇:我的印象是一个类是常量,方法等的存储库……并且为了访问它大多数情况下,您首先需要创建该类的实例,或者在某些情况下,可以调用它们自身的方法(因为它们在技术上都是全局对象的一部分).然后我看到这样的事情: #WorkedTime.now 我理解为这是调用类[Time]实例的方法[now].然后我尝试自己调用该方法: # 我接近Code Academy中 Ruby轨道的终点,我对一个特殊的东西感到好奇:我的印象是一个类是常量,方法等的存储库……并且为了访问它大多数情况下,您首先需要创建该类的实例,或者在某些情况下,可以调用它们自身的方法(因为它们在技术上都是全局对象的一部分).然后我看到这样的事情:

#WorkedTime.Now

我理解为这是调用类[Time]实例的方法[Now].然后我尝试自己调用该方法:

#FailedNow

并且失败了,我假设虽然可以在一般范围[作为全局对象的一部分]创建方法,但如果它依赖于“父”类的初始化变量,则它不能单独调用,因为它会不知道搜索那些初始化变量的对象.之后我创建了一个测试类:

class Clock  def initialize    @hours = 1    @minutes = 30  end  def showTime    puts "The time is: #{@hours}:#{@minutes}"  endend#this workedwatch = Clock.newwatch.showTime#this FailedshowTime

然后我创建了一个基本方法(假设它在全局级别)

def mymethod    puts "The mighty METHOD!"end#Worksmymethod

并按照我的方式调用此方法,而不引用全局对象.所以…我的问题如下:

>如何以这种方式调用[Time.Now]?不应该首先创建时间实例吗?
>为什么我不能单独调用[Now]方法?我是对的,它依赖于以这种方式调用时无法找到的资源吗?
>为什么我不能单独调用showTime方法?但是如果我在“全局”级别定义任何方法,我可以在不引用全局对象的情况下访问它

解决方法 首先,你的直觉是正确的.

每个方法都必须是某个接收器的实例方法.

全局方法被定义为Object类上的私有实例方法,因此似乎是全局可用的.为什么?从任何上下文Object总是在self的类层次结构中,因此Object上的私有方法总是可以在没有receiver的情况下调用.

def fuuuuuuuuuuunendObject.private_methods.include?(:fuuuuuuuuuuun)# => true

类方法被定义为其类实例的“单例类”上的实例方法. Ruby中的每个对象都有两个类,一个是“单例类”,实例方法只适用于那个单个对象,一个“普通类”,带有该类所有对象的方法.类没有什么不同,它们是Class类的对象,可能有单例方法.

class A  class << self # the singleton class    def example    end  endendA.singleton_class.instance_methods.include?(:example)# => true

定义类方法的替代方法是

class A  def self.example  endend# or def A.exampleend

有趣的是,您可以使用相同的语法def(接收器)定义任何对象(不仅仅是类对象)上的单例方法.(方法名称)如下

str = "hello"def str.square_size  size * sizeendstr.square_size# => 25"any other string".square_size# => raises NoMethodError

一些编程语言历史 – Singleton类来自Smalltalk语言,它们被称为“元类”.基本上Ruby中的所有面向对象特性(以及Enumerable上的函数式枚举器)都取自Smalltalk语言. Smalltalk是一种早期基于类的面向对象语言,创建于70年代.它也是发明图形用户界面的语言,如重叠窗口和菜单等.如果你喜欢Ruby也可以看看Smalltalk,你可能会再次坠入爱河.

总结

以上是内存溢出为你收集整理的ruby – 为什么可以在没有父类实例的情况下调用某些类和/或方法?全部内容,希望文章能够帮你解决ruby – 为什么可以在没有父类实例的情况下调用某些类和/或方法?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1241933.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存