【问题标题】:Ruby Definition of SelfRuby 的自我定义
【发布时间】:2023-04-01 23:46:01
【问题描述】:

我在阅读一本 Ruby 书籍时遇到了伪变量 self 的这个定义:

self - 当前的接收者对象 方法

谁能打破这个定义并解释它的含义?一点都不懂。

编辑:我实际上对 self 是什么(及其应用程序)有一个很好的了解,并且我知道如何在 Google 上进行搜索。我只是想知道是否有人可以解释我引用的定义。具体来说。

【问题讨论】:

标签: ruby self


【解决方案1】:

Ruby 和其他语言(例如 Smalltalk 和 Objective-C)更喜欢术语“消息传递”,而 Java 和 C++ 更喜欢“方法调用”。也就是说,“Java 方式”是调用对象的方法——在对象的上下文中运行代码——而“Ruby 方式”是向对象发送消息,对象通过运行其方法来响应该消息。

Ruby 将my_string.length 描述为“发送my_stringlength 消息”。 my_string 接收消息,因此称为接收者;在length 方法的定义中,self 将引用my_string。使用my_string.send(:length)也可以达到同样的效果。

从消息传递的角度考虑这个概念比从方法调用的角度考虑更灵活。要调用对象上的方法,该方法必须已预先定义,而您可以向对象发送一条消息,它可以选择动态处理(使用respond_to?method_missing)。这种灵活性是允许将 Ruby 用作简洁的领域特定语言 (DSL) 的一个方面。

【讨论】:

    【解决方案2】:

    self 是一个特殊变量,会根据上下文而变化。更具体地说,它是当前方法的接收器对象,正如您所提到的。要理解这一点,我们需要了解接收者的含义。

    Programming RubyMore About MethodsClasses and Objects

    你通过指定一个方法来调用一个方法 接收者,方法的名称,和 可选的一些参数和一个 关联块。

    connection.downloadMP3("jitterbug") { |p| showProgress(p) }
    

    在本例中,对象connection 是接收者,downloadMP3 是 方法的名称,"jitterbug" 是 参数,以及之间的东西 大括号是关联的块。

    foo = "hello"
    bar = foo.dup
    class <<foo
      def to_s
        "The value is '#{self}'"
      end
      def twoTimes
        self + self
      end
    end
    
    foo.to_s        »   "The value is 'hello'"
    foo.twoTimes    »   "hellohello"
    bar.to_s        »   "hello"
    

    foo.twoTimes中,foo部分被称为方法调用的接收者。 因此,在twoTimes 方法中,self 指的是上下文中的对象foo

    There is also a very good explanation here

    【讨论】:

    • @MauricioGracia 我不确定编辑的目的是什么。如果链接有用,它不应该作为一个独立的答案吗?
    • 编辑的目的是补充一个好的答案 - 使用单个链接作为答案是一种不好的做法(他们通常建议放置链接的内容而不仅仅是链接)
    【解决方案3】:

    self - 当前的接收者对象 方法

    Ruby 中的“方法调用”是通过消息发送机制完成的。所以

    some_object.some_method(args)
    

    的简写
    some_object.send(:some_method, args)
    

    我认为这就是引用的意思:“self”是消息(或方法)已发送到的对象:当前方法的接收者。

    整个消息发送是 Ruby 如此动态的部分原因。它使对象可以轻松地为它当前不处理的消息定义method_missing 并决定如何处理它们。 Rails 经常使用这个:例如,ActiveRecord 有“find_by...”语法,它从被调用/发送的方法的名称中找出想要的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 2015-07-25
      • 2022-10-06
      • 1970-01-01
      • 2015-06-08
      • 2012-06-02
      • 2013-09-02
      相关资源
      最近更新 更多