Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 多参数_Ruby - Fatal编程技术网

Ruby 多参数

Ruby 多参数,ruby,Ruby,我有一个允许用户连接到HDFS的对象。一种方法允许他们下载数据,另一种方法允许他们上传数据。initialize方法如下所示: def initialize(file=nil,set=nil,action) end 如何更改参数的传递方式以提高效率?每次都需要操作参数,但仅根据操作需要文件和文件集。也就是说,如果他们想上传数据,他们需要通过set,如果他们想下载数据,他们只需通过文件,首先你应该首先通过所需的参数,例如: def initialize(action, file = nil, s

我有一个允许用户连接到HDFS的对象。一种方法允许他们下载数据,另一种方法允许他们上传数据。
initialize
方法如下所示:

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

如何更改参数的传递方式以提高效率?每次都需要
操作
参数,但仅根据
操作
需要
文件
文件集
。也就是说,如果他们想上传数据,他们需要通过
set
,如果他们想下载数据,他们只需通过
文件

,首先你应该首先通过所需的参数,例如:

def initialize(action, file = nil, set = nil)
end
然后,您可能希望使用哈希传递可选参数:

def initialize(action, options = {})
end
当需要传递多个可选参数时,传递散列是一种常见的方法。 当您需要传递
文件
设置
或两者同时传递时,您可以按如下方式调用initialize方法(假设此方法在
类MyModel
中被防御):

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

MyModel.new(action)

在这种情况下,将在
initialize
方法中传递空选项散列

首先,您应该首先通过所需参数,例如:

def initialize(action, file = nil, set = nil)
end
然后,您可能希望使用哈希传递可选参数:

def initialize(action, options = {})
end
当需要传递多个可选参数时,传递散列是一种常见的方法。 当您需要传递
文件
设置
或两者同时传递时,您可以按如下方式调用initialize方法(假设此方法在
类MyModel
中被防御):

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

MyModel.new(action)

在这种情况下,将在
initialize
方法中传递空选项散列

非常常见的是在位置参数是必需的情况下使用它们,并使用选项散列 其余的。您只需检查操作以验证给定参数是否存在:

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

非常常见的是在位置参数是必需的情况下使用它们,并使用选项散列 其余的。您只需检查操作以验证给定参数是否存在:

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

自Ruby 2.0以来,您可以使用:

所以你可以称之为:

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)
...

自Ruby 2.0以来,您可以使用:

所以你可以称之为:

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)
...

在这种情况下,文件或集合也总是必需的(必须提供其中一个),因此它们不是真正的选项。明白我的意思了吗?@GrahamJackson我添加了一些进一步的解释。在现代Ruby中,必需的参数可以在可选参数之后。现代Ruby已经命名了参数。在这种情况下,文件或集合也总是必需的(必须提供其中一个),因此它们不是真正的选项。明白我的意思了吗?@GrahamJackson我添加了一些进一步的解释。在现代Ruby中,必选参数可以在可选参数之后。现代Ruby有命名参数。这是老式的。这是老式的。