gpt4 book ai didi

ruby - 如何拒绝在 Ruby 中创建实例变量

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:10 24 4
gpt4 key购买 nike

我想拒绝在 Ruby 中创建实例变量,以防止“错误地”创建无人值守的变量。

My class:

class Test
def initialize
@a = 'Var A'
end

def make_new
@b = 'Var B' <-- I would like to deny creation of any variables that were not defined during the init
end
end

最佳答案

我不认为这是个好主意,但只是 b/c 它有点有趣,这是一个解决方案,它会在创建新的 ivar 时抛出异常,但也会让您修改已定义的实例变量 (不像卡住类)。只是把它放在一起,毫无疑问,它有一些问题,包括它重复每个方法的事实:)

module IvarBlocker
def method_added(method)
alias_name = "__#{method}_orig"
return if method == :initialize || method_defined?(alias_name) || method.match(/__.*_orig/)

alias_method alias_name, method
define_method(method) do |*args|
ivars_before = instance_variables.dup
send(alias_name, *args).tap { raise "New Ivar assigned" if !(instance_variables - ivars_before).empty? }
end
end
end

用法

class Test
extend IvarBlocker

def initialize
@a = 1
end

def set_b
@b = 2
end

def set_a
@a = 6
end
end

t = Test.new #=> #<Test:0x007f87f13c41e8 @a=1>
t.set_b #=> RuntimeError: New Ivar assigned
t.set_a #=> 6

关于ruby - 如何拒绝在 Ruby 中创建实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20108182/

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