gpt4 book ai didi

ruby - 在 Ruby 中跨模块使用实例变量

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:47 25 4
gpt4 key购买 nike

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

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() 确实设置了实例变量。您还可以看到我定义了 view(),我希望能够访问该 @url 变量。

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

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

最佳答案

我认为您对类实例变量 @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 中,因此它正在访问 @url用于 Test实例

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

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

关于ruby - 在 Ruby 中跨模块使用实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23254704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com