ruby 限制方法范围,避免全局范围

1l5u6lss  于 2023-04-05  发布在  Ruby
关注(0)|答案(1)|浏览(119)

我希望有一种方法可以在本地定义方法。例如,当你不想污染全局范围时,可以编写一些计算,比如python notebook。
有没有一种方法可以限制方法的作用域,就像下面的代码一样?

begin
  def some
  end

  some
end

some # <= Should'n work here
ujv3wf0j

ujv3wf0j1#

def将方法附加到作用域中的任何类。对于顶级方法,即Object。由于这是所有内容的基类,因此它使方法在任何地方都可用。
为了防止这种情况,你需要引入一个新的作用域,例如打开一个classmodule

module A
  def self.foo
    puts "Hi!"
  end

  foo # Hi!
end

foo # undefined local variable or method `foo' for main:Object (NameError)

class B
  def foo
    puts "Hey!"
  end

  new.foo # Hey!
end

B.new.foo # Hey!
foo # still NameError

请注意,单独使用def并不会改变def的作用域:

class C
  def foo
    def bar
      puts "Wat"
    end
  end
end

C.new.bar # Wat

你可以使用lambda,它是一个类似于方法的对象,存储在局部变量中,因此遵循局部变量作用域规则:

class D
  def foo
    bar = lambda do
      puts "Heyo!"
    end
    bar[]
  end
end

D.new.foo # Heyo!
D.new.bar # undefined method `bar' for #<D:0x0000000105f04280> (NoMethodError)

缺点是lambda在其他方面的工作方式不同,例如它们如何处理return和方法参数,因此将方法转换为lambda可能是不平凡的。

相关问题