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

Posted

技术标签:

【中文标题】(Ruby,Rails)模块和库中SELF的上下文......?【英文标题】:(Ruby,Rails) Context of SELF in modules and libraries...? 【发布时间】:2010-11-01 02:13:56 【问题描述】:

关于在模块或库中使用“SELF”的快速问题。基本上,“SELF”的范围/上下文与模块或库有关,如何正确使用它?有关我所说的示例,请查看使用“restful_authentication”安装的“AuthenticatedSystem”模块。

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

【问题讨论】:

【参考方案1】:

在一个模块中:

当您在实例方法中看到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

【讨论】:

没错。在 Ruby 中,一切都是对象。没有自我,就没有地方可以执行代码。 明白了,那么在模块中调用self的作用域/目的是什么? 大家好,仍在寻找明确的答案。我意识到SELF 可以做什么。我需要知道的是它在一个模块的功能中做什么?我猜想某种类型的变量是全局设置的,但我不确定是否是这种情况。任何人都可以确认/启发吗? 我想我不太明白你的问题。它有什么作用?它用作对封闭对象的引用。在模块中,在实例方法之外,它用作对模块本身的引用。在模块中但在实例方法中,它用作对封闭类实例的引用。【参考方案2】:

简短的总结... http://paulbarry.com/articles/2008/04/17/the-rules-of-ruby-self

self 还用于添加类方法(或 C#/Java 人员的静态方法)。下面的sn-p就是给当前类对象添加一个叫do_something的方法(静态)...

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

【讨论】:

以上是关于(Ruby,Rails)模块和库中SELF的上下文......?的主要内容,如果未能解决你的问题,请参考以下文章

ruby/rails:如何确定是不是包含模块?

Ruby/Rails - 为啥自我关联条件取决于创建时间?

在 Ruby on Rails 的上下文中引用时,啥是中间件?

Ruby on Rails 中的 Runner

ruby 用于双因素身份验证(TOTP)的Rails mixin模块

使用 Ruby on Rails ActiveSupport::Concern 功能时如何“嵌​​套”包含模块?