在Ruby中将可选参数从父级传递给子级

时间:2011-12-15 17:26:12

标签: ruby dry argument-passing

如果没有对File.open进行两次单独调用,并且没有查看File.open permissions的默认值,则必须采用干扰方式执行此操作。正确?

def ensure_file(path, contents, permissions=nil)
  if permissions.nil?
    File.open(path, 'w') do |f|
      f.puts(contents)
    end
  else
    File.open(path, 'w', permissions) do |f|
      f.puts(contents)
    end
  end
end

2 个答案:

答案 0 :(得分:4)

使用splat(即*some_array)将适用于一般情况:

def ensure_file(path, contents, permissions=nil)
  # Build you array:
  extra_args = []
  extra_args << permissions if permissions
  # Use it:
  File.open(path, 'w', *extra_args) do |f|
    f.puts(contents)
  end
end

在这种情况下,您已经将permissions作为参数,因此您可以通过允许任意数量的可选参数并传递它们来简化此操作(并使其更加通用):

def ensure_file(path, contents, *extra_args)
  File.open(path, 'w', *extra_args) do |f|
    f.puts(contents)
  end
end

唯一的区别是,如果传递的参数太多,则在调用ArgumentError而不是File.open时会引发ensure_file

答案 1 :(得分:1)

File.open(path, 'w') do |f|
  f.puts(contents)
  f.chmod(permission) if permission
end