如何定义Ruby中没有类型的参数的方法

时间:2014-01-12 21:55:34

标签: ruby methods arguments dsl

如果我定义了一个方法:

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类中定义的方法。

3 个答案:

答案 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'