Ruby:我如何访问模块的局部变量



我得到这个错误:MyModule.rb:4:在getName': undefined local variable or method s’中用于MyModule:Module(NameError)

file1

module MyModule
  s = "some name"
  def self.getName()
    puts s
  end 
end

file2

require './MyModule.rb'
include MyModule
MyModule.getName()

这与范围有关,但如果我在方法之前声明它,我不明白为什么会发生这种情况。是否只包括mixin方法而不包括变量?我如何更改我的模块,以便它可以打印出我在模块中定义的变量?

这与范围有关,但我不明白为什么会发生这种情况

def创建一个新的作用域。在某些语言中,内部作用域可以在周围的作用域中看到局部变量,但在ruby中看不到。你可以用一个常数来代替:

module MyModule
  S = "some name"
  def getName()
    puts S
  end 
end
include MyModule
getName
--output:--
some name

但是常数可以从任何地方访问:

module MyModule
  S = "some name"
  def getName()
    puts S
    puts Dog::S
  end 
end
module Dog
  S = "hello"
end
include MyModule
getName
--output:--
some name
hello

更高级的解决方案包括使用闭包。与def不同,块可以看到周围范围中的局部变量,这被称为在变量上关闭。这里有一个例子:

module MyModule
  s = "some name"
  define_method(:getName) { puts s }
end
include MyModule
getName
--output:--
some name

使用闭包的优点是,只有块才能访问s

是否只包括mixin方法而不包括变量?

这取决于变量的类型:

module MyModule
  A = 'hello'
  s = 'goodbye'
end
include MyModule
puts A
puts s
--output:--
hello
1.rb:9:in `<main>': undefined local variable or method `s' for main:Object (NameError)

module关键字和def一样,创建了一个新的作用域。你知道当一个方法完成执行时,局部变量是如何被破坏的吗?当一个模块完成执行时,它的局部变量也会被破坏:

module MyModule
  puts "MyModule is executing"
  s = 'goodbye'
end
include MyModule
puts s
--output:--
MyModule is executing
1.rb:7:in `<main>': undefined local variable or method `s' for main:Object (NameError)

最新更新