Ruby:与接受多个参数的方法进行交互的最佳方法是什么?

时间:2018-07-16 00:11:21

标签: ruby variables methods arguments

也许是重复的,但我同时搜索了SO和Google,尽管找不到答案,但还是找不到答案。

Ruby方法需要多个参数。

def initialize(options = {})
  requires!(options, :arg1, :arg2, ...)
  super
end

在不事先知道这些必需参数的情况下,如何调用具有可变数量参数的这种方法?

我已经知道Ruby 1.9.2,后来我们可以在方法上使用parameters方法来获取该方法的参数列表,并且我可以想象在那里可以重用该方法来调用该方法,因为我们知道它的参数。是吗?

如果不正确,与这种采用可变数量的必需参数的方法进行交互的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

您的问题基本上等于“我如何知道一些我不知道的事情”。

坦率地说,对此的答案是去了解它。在编程以及如何调用方法的上下文中,将应用相同的逻辑,这是文档的唯一目的,并且是学习编写Ruby代码的相同方法。我确信您像我们所有人一样,都花了很多时间浏览文档,以了解如何编写代码,可以使用的方法,它们的用途,如何调用它们,等等。

如果您发现一个函数的存在,并且您最初只能说出它具有可变数量的参数,那么您需要弄清楚它。这通常意味着需要查找它的文档,或者如果您可以访问源代码,则可以检查方法主体并查看是否可以确定其用法。

这就是为什么好的文档是必不可少的的原因,对于那些无法实际看到方法主体和/或其签名的编译语言而言,尤其如此。如果没有文档,那么恕我直言,它是废话,您不应该使用它。这就像用自己的词汇来写一本书,并期望人们不得不尝试破译每个单词甚至阅读它一样。您可以编写最漂亮的代码,如果不解释如何使用它,那么公开它又有什么意义呢?

简单地说,如果您不了解方法或方法的用途,则不应与它“交互”,至少在关心代码是否健壮的情况下。您应该如何调试甚至不理解的代码?没有explain_how_to_use_this(method)函数可以调用,您将需要对其进行研究并进行一些老式的学习。

答案 1 :(得分:0)

我不认为该方法应该与传入的参数有关。它所关心的只是它执行所需操作所需的参数。

这样,您将拥有一个initialize方法,从与其相关的哈希中获取键,而不必担心其他键。

class Person
  def inititialize(opts: {})
    @name = opts[:person_name] # could be nil
  end
end

class Car
  def initialize(opts: {})
    @brand = opts[:car_brand] # could be nil
  end
end

opts = { person_name: "Ivan", car_brand: "Fiat", something_else: "ignored" }

c = Car.new(opts) # is unaware of what is in 'opts'
#<Car:0xd34db33f>
p = Person.new(opts) # is unaware of what is in 'opts'
#<Person:0x1337b347>

我认为封装是一个原则。方法应该只知道它们需要知道什么才能起作用。范围不应立法从其环境中传入的数据。

如果您牢记这一点,则可以将任何内容传递给该方法,并允许该方法按其意愿进行操作。

答案 2 :(得分:0)

据我所知,您不想提供散列作为参数,而是要提供一个值数组,跳过键名。

如果您使用的是第三方库,并且在该库中定义了该方法-这是不可能的,因为该方法旨在接收指定形式的参数(在您的示例中,哈希必须具有一些特定的键),而Ruby不能提供任何功能来知道用户的想法(如果想极端,您当然可以编写源文件解析器,该解析器将从该哈希中提取参数)。

如果您要自行设计方法,则可以:

def initialize(arguments = {}) 
  case arguments
  when Hash
    @foo = arguments[:foo]
    @bar = arguments[:bar]
  when Array
    @foo = arguments[0]
    @foo = arguments[1]
  else
    raise ArgumentError.new("argument of type Hash or Array expected")
  end
end