如果我定义了一个方法:
def weird_method(first_argument, second_argument)
#code here
end
所以这样我可以传递如下参数:1,:digit,'some',“more”(Fixnum,Symbol,String等),但是如果我想传递的话: argument1,argument2 ,我的意思是没有类型的值,看起来像局部变量但实际上并非如此。我怎么能以某种方式接受它们并在方法体中使用它们?
PS:我需要它来实现一个小型DSL,当传递blok时,它可以在 .isntance_eval 中执行此类操作
Something.with_method do
sum 1, 2 #(I can implement it)
play volleyball #(I can NOT implement it)
swim further #(I can NOT implement it)
eat "a lot" #(I can implement it)
end
修改
一切都可以在排球和进一步的基础上进行。我只是举了个例子。 sum,play,swim,eat是Something类中定义的方法。
答案 0 :(得分:2)
符号存在的目的与您在此处所讨论的目的完全相同:它们是仅为自己评估的价值观。符号:volleyball
是符号:volleyball
,它就是它的全部。它没有其他价值或意义。
如果您只是想让它以不同的方式阅读以达到审美目的,那么您最好的选择可能是定义返回相应符号的方法(例如def volleyball() :volleyball end
)。但这似乎是单一的。
如果您真的希望人们能够发送任何尚未成为方法的内容,您可以按method_missing
的方式实施def method_missing(m, *args) m.to_sym end
。但我真的觉得这个设计在我能想到的大多数情况下都很尴尬。
答案 1 :(得分:1)
class Something
attr_reader :callstack
def initialize
@callstack = {}
end
def self.with_method &block
self.new.instance_exec &block
end
def method_missing method, *params
params.empty? ? method : callstack[method] = params
end
end
Something.with_method do
sum 1, 2
play volleyball
swim further
eat "a lot"
puts callstack # => {:sum=>[1, 2], :play=>[:volleyball], :swim=>[:further], :eat=>["a lot"]}
end
这有帮助吗?
答案 2 :(得分:-1)
您必须将对象作为方法参数传递。您尝试通过传递任意未定义的名称来实现什么功能?您始终可以将它们作为字符串传递,然后使用该字符串来使用方法内的文本。
离。
def self.methodname(arg1, arg2)
arg1 = arg2
end
Class.methodname("greeting","hello")
将变量greeting设置为'hello'