多个参数

时间:2014-06-06 14:32:28

标签: ruby

我有一个允许用户连接到HDFS的对象。一种方法允许他们下载数据,而另一种方法则上传数据。 initialize方法看起来像这样:

def initialize(file=nil,set=nil,action)
end

如何更改参数的传递方式以提高效率?每次都需要action参数,但filefile_set只需要action。也就是说,如果他们想要上传需要传递set的数据,如果他们想要下载数据,他们就会通过file

3 个答案:

答案 0 :(得分:2)

从Ruby 2.0开始,您可以使用keyword parameters

def initialize(action, file: nil,set: nil)
  unless file.nil?
    # do stuff with file
  end
end

所以你可以称之为:

MyClass.new(some_action)
MyClass.new(some_action, set: some_set)
MyClass.new(some_action, file: some_file)
MyClass.new(some_action, set: some_set, file: some_file)
...

答案 1 :(得分:1)

首先,您应首先传递requred参数,例如:

def initialize(action, file = nil, set = nil)
end

然后你可能想用hash来传递可选的参数:

def initialize(action, options = {})
end

当您需要传递多个可选参数时,传递哈希是一种常见方式。 当您需要传递fileset或两者时,您可以调用初始化方法,如下所示(假设此方法在class MyModel中失效):

MyModel.new(action, {file: ''})
MyModel.new(action, {set: ''})
MyModel.new(action, {file: '', set: ''})

或者当您不想传递任何可选参数时,只需致电:

MyModel.new(action)

在这种情况下,您将在initialize方法中传递空选项哈希。

答案 2 :(得分:1)

相当常见的是在必需时使用位置参数,以及选项哈希 对于其余的。您只需要检查操作以验证是否存在给定的参数:

def initialize(action, opts={})
  if action == 'foo'
    raise ArgumentError, "requires either :file or :set" unless 
      ([:file, :set] & opts.keys).size == 1
  end
  ...
end