如何在Ruby中定义一个参数没有类型的方法[关闭]

Posted

技术标签:

【中文标题】如何在Ruby中定义一个参数没有类型的方法[关闭]【英文标题】:How can I define a method which arguments have no type in Ruby [closed] 【发布时间】:2014-01-31 13:53:06 【问题描述】:

如果我定义了一个方法:

def weird_method(first_argument, second_argument)
  #code here
end

这样我就可以传递如下参数:1、:digit、'some'、"more"(Fixnum、Symbol、String 等),但是如果我只想传递这个:argument1、argument2 ,我的意思是没有类型并且看起来像局部变量但实际上不是的值。我怎样才能以某种方式接受它们并在方法体中使用它们?

PS:我需要它来实现一个小的 DSL,当块被传递时,它可以在 .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 类中定义的方法。

【问题讨论】:

没有没有类型的值这样的东西,volleyball 在你的例子中是什么?方法?变量? 如果你想传递另一个变量或方法的名称,那么通常使用StringSymbol,因为这些可以与@一起使用987654326@、define_method 和其他 Ruby 元编程方法。 @mechanicalfish sum, play, swin, eat 都是 my Something 中的方法。争论就是问题。 这个方法对我来说很奇怪 【参考方案1】:

符号的存在正是您在此处谈论的目的:它们是仅对自身进行评估的值。符号:volleyball 就是符号:volleyball,这就是它的全部。它没有其他价值或意义。

如果您只是为了审美目的而希望它以不同的方式阅读,您最好的选择可能是定义返回适当符号的方法(例如def volleyball() :volleyball end)。但这似乎不合时宜。

如果您真的希望人们能够发送几乎任何还不是方法的东西,您可以按照def method_missing(m, *args) m.to_sym end 的方式实现method_missing。但在我能想到的大多数情况下,我真的觉得这种设计很尴尬。

【讨论】:

【参考方案2】:
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

这有帮助吗?

【讨论】:

请看,排球等只是示例。你的逻辑说我只能通过排球和进一步。如果我想将足球、垒球、棒球等传给比赛方法怎么办?一切都可以在 play 方法参数上进行 我已经更新了答案,这就是你要找的吗? 好吧,这不是调用堆栈。另外,当我启动您的代码时,它只接受 sum 和 eat 的参数。玩耍和游泳似乎“毫无争议”。 确实如此,而且他们并非毫无争议。 volleyballfurther 是这里的参数。我建议重新考虑你的问题,因为显然你不知道你在问什么。 好问题。我会尝试改进或拯救NameError【参考方案3】:

您必须将对象作为方法参数传递。您试图通过传递任意未定义的名称来完成什么功能?您总是可以将它们作为字符串传递,然后使用该字符串来使用方法内的文本。

例如。

def self.methodname(arg1, arg2)
  arg1 = arg2
end

Class.methodname("greeting","hello")

将变量greeting设置为等于'hello'

【讨论】:

Sam,您需要在答案中格式化代码。突出显示它并单击 图标或用反引号(反斜单引号,位于我的 Mac 键盘的左上角)包围代码。 (好多了!) 它的想法是实现一个仅使用 4 个寄存器的简单汇编程序,并且在某些时候我可以放置标签,跳转到代码中的命令,但很难解释它。如果像这样传递参数,我只需要能够接受它们。

以上是关于如何在Ruby中定义一个参数没有类型的方法[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 方法可见性:未定义的方法? [关闭]

Ruby 中的方法和消息有啥区别? [关闭]

传递哈希而不是方法参数[关闭]

ruby 内省:如何问ruby 方法定义在哪里? [复制]

如何运行一个ruby类 中的方法

定义? Ruby 和 Rails 中的方法