(Ruby, Rails) 模块和库中 SELF 的上下文是什么?

28

关于在模块或库中使用“SELF”的问题,请问它的范围/上下文是什么,以及如何正确使用它?对于我所讲的内容的示例,请查看安装了“restful_authentication”中的“AuthenticatedSystem”模块。

注意:我知道在其他语言中'self'等同于'this',以及'self'如何在类/对象上操作,但在模块/库的上下文中没有任何要指向的'self'。那么,在像没有类的模块中,“self”的上下文是什么呢?

2个回答

50
在一个模块中:
当您在实例方法中看到self时,它指的是包含该模块的类的实例。
当您在实例方法外看到self时,它指的是该模块。
module Foo
  def a
    puts "a: I am a #{self.class.name}"
  end

  def Foo.b
    puts "b: I am a #{self.class.name}"
  end

  def self.c
    puts "c: I am a #{self.class.name}"
  end
end

class Bar
  include Foo

  def try_it
    a
    Foo.b # Bar.b undefined
    Foo.c # Bar.c undefined
  end
end

Bar.new.try_it
#>> a: I am a Bar
#>> b: I am a Module
#>> c: I am a Module

2
没错。在 Ruby 中,一切都是对象。没有代码可以在没有 self 的情况下执行的地方。 - Chuck
明白了,那么在模块中调用self的范围/目的是什么? - humble_coder
大家好,仍然在寻找一个明确的答案。我知道SELF 可以 做什么。但是我需要知道的是,在模块的函数中它到底 做了 什么?我猜测可能是设置了某种全局变量,但我不确定这是否属实。有人能否确认/解释一下吗? - humble_coder
我想我真的不理解你的问题。它是做什么的?它作为封闭对象的引用。在模块中,在实例方法之外,它作为对模块本身的引用。在模块中但在实例方法内部,它作为对封闭类实例的引用。 - Sarah Mei

0

简而言之... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

self也用于添加类方法(或C#/Java人的静态方法)。以下代码片段将在当前类对象(静态)中添加一个名为do_something的方法...

class MyClass
    def self.do_something   # class method
       # something
    end
    def do_something_else   # instance method
    end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接