我有一个允许用户连接到HDFS的对象。一种方法允许他们下载数据,而另一种方法则上传数据。 initialize
方法看起来像这样:
def initialize(file=nil,set=nil,action)
end
如何更改参数的传递方式以提高效率?每次都需要action
参数,但file
和file_set
只需要action
。也就是说,如果他们想要上传需要传递set
的数据,如果他们想要下载数据,他们就会通过file
。
答案 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
当您需要传递多个可选参数时,传递哈希是一种常见方式。
当您需要传递file
,set
或两者时,您可以调用初始化方法,如下所示(假设此方法在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