gpt4 book ai didi

Ruby:处理任意方法名称

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

我记得看过 Dave Thomas 的 ruby​​ 截屏视频,内容是关于使用元编程创建不需要遵守标识符语法要求的方法名称。通常,标识符不得包含空格。他还展示了如何创建带有空格的方法。但我不记得它是怎么做到的。

我有一个类的任意字段名称,包括s Mongoid::Document。这很好用,其中 _field 可以是像“Hello World”这样的字符串:

MyClass.class_eval <<-EOS
field :'#{ _field }', type: #{_type}
EOS

我想覆盖 setter 。所以我尝试了这个:

MyClass.class_eval <<-EOS
field :'#{ _field }', type: #{_type}
def #{ _field }=(val)
self['#{ _field }'] = [self.send('#{ _field }')[0], val]
end
EOS

不幸的是,如果 _field 是一个像 'Hello World' 这样的字符串,我会得到一个错误:

SyntaxError: (eval):2: formal argument cannot be a constant
def Hello World=(val)

我该如何解决这个问题?

最佳答案

define_method 让您可以这样做:

define_method(:"hello world") { puts 'hello world' }
send :"hello world"

但是你必须用 send 调用它,因为普通调用语法中的方法名称也是不允许的。


您也可以从类定义中执行此操作。

class MyClass
def name
@name
end

define_method :"set name" do |new_name|
@name = new_name
end
end

instance = MyClass.new
instance.send :"set name", 'Bob'
instance.name #=> Bob

最后,我不得不说这可能是个糟糕的主意。我不确定确切您在这里的目的是什么,但可能有更好的方法。 :can != :should.

关于Ruby:处理任意方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40009904/

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