gpt4 book ai didi

ruby - 为什么我不能访问 class_eval block 中的局部变量?

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

为什么我无法访问 class_eval block 中的变量 vehicle:

class Vehicle
def self.number_of_wheels
fail 'DEFINE in subclass'
end

def self.name
fail 'DEFINE in subclass'
end

def self.define_methods
number_of_wheels.times do |index|
define_method("wheel_#{index}") do
"This is wheel #{index} of #{self.class.name}"
end
end
end
end

klasses = %w(
tri_cycle
motor_boat
).map do |vehicle| # THE VARIABLE I WANT TO ACCESS
klass = Class.new(Vehicle)

klass.class_eval do
def self.number_of_wheels
4
end

def self.name
vehicle # using a string here will work
end

define_methods
end

klass
end

klasses.map { |k| k.new.wheel_1 } # =>
# ~> -:31:in `name': undefined local variable or method `vehicle' for #<Class:0x007ff6ea181800> (NameError)
# ~> from -:13:in `block (2 levels) in define_methods'
# ~> from -:40:in `block in <main>'
# ~> from -:40:in `map'
# ~> from -:40:in `<main>'

最佳答案

这就是所谓的“作用域门”。一旦方法、类或模块的定义开始,局部变量就会超出范围。有关更深入的信息,请参阅本书:https://pragprog.com/book/ppmetr2/metaprogramming-ruby-2

您可以使用 define_methoddefine_singleton_method(任何适合您的方式)代替 def 语法(因为这将是一个方法调用,不是方法定义)

关于ruby - 为什么我不能访问 class_eval block 中的局部变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31461084/

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