【问题标题】:Using Instance Variables Across Modules in Ruby在 Ruby 中跨模块使用实例变量
【发布时间】:2014-04-23 20:37:47
【问题描述】:

这是我希望能够支持的脚本示例:

class Testing
  include Dialect

  url_is 'http://localhost:9292'
end

@page = Testing.new
@page.view

这里需要注意的是:

  1. 我包含了一个方言模块。 (代码如下所示。)
  2. 我在类上直接调用 url_is() 方法。
  3. 我在类的一个实例上调用 view() 方法。

url_is() 方法将设置一个@url 变量。 view() 方法理想地能够读取该变量。那是我似乎无法做到的。以下是支持上述脚本的代码:

module Dialect
  module Generator
    module Assertion
      def url_is(url)
        @url = url
      end
    end
  end
end

module Dialect
  def self.included(caller)
    caller.extend Dialect::Generator::Assertion
  end

  def view
    puts "#{@url}"
  end
end

在这里您可以看到,当包含 Dialect 时,我有一个包含方法来扩展我的 Assertion 模块。这允许 url_is() 工作并且 url_is() 确实设置了实例变量。您还可以看到我定义了我希望能够访问该 @url 变量的 view()。

没有发生的是后半部分。我明白为什么我试图从 Dialect 模块中的 Dialect::Generator::Assertion 模块中读取一个变量,但我不确定最好的方法是什么。

我调查了module and class variable scopeRuby mixins and instance variables,但没有发现任何可以确定与我所描述的情况相关的信息。

【问题讨论】:

  • 模块内的实例变量? :-/
  • @uDaY 我带你觉得这里的实例变量甚至不是合适的方法?我可以使用不同的方法,只要我提供的脚本可以以相同的方式运行:意味着直接在类上使用一些元素,如 url_is(),在类的实例上使用其他元素,如 view()。
  • 模块不能像类一样实例化。所以我想知道为什么你需要一个实例变量。

标签: ruby scope mixins


【解决方案1】:

我认为您对 类实例变量 @view 感到困惑。

当您访问实例变量时,所引用的“实例”是self。在实例方法中,self 是类的实例(如您所料)。在一个类中,self 是类本身(Class 的一个实例)!这应该说明区别:

class Foo
  @x = 0

  def initialize
    @x = 1
  end

  def self.x
    @x
  end

  def x
    @x
  end
end

Foo.x # 0
Foo.new.x # 1
Foo.x # still 0, they are entirely separate variables

当您扩展Dialect::Generator::Assertion 时,url_is 将作为类方法添加到Test,因此@url 被设置为Test 本身的实例变量。但是当您包含Dialect 时,view 将作为实例方法添加到Test,因此它正在访问的@urlTestinstance

view方法中,你可以简单地指定你需要变量的类版本

def view
  self.class.class_eval { "#{@url}" }
end

【讨论】:

  • def view; @@url; end 更好;)
  • 啊,明白了。所以我可以做到这一点的另一种方法是在 Dialect::Generator::Assertion 中放入 def url; @url; end 方法,然后在我的 view() 方法中我可以调用该方法,就像在 self.class.url 中一样。现在这一切都变得更有意义了,你是对的:我混淆了我正在使用的元素。
  • @mdesantis 类实例变量与类变量不同。他需要重写大部分代码才能使用@@url
  • @Max 你是对的,我总是对它们感到困惑>。
猜你喜欢
  • 1970-01-01
  • 2011-10-03
  • 2010-10-16
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 1970-01-01
  • 2022-06-11
  • 2014-09-21
相关资源
最近更新 更多