2011-12-15 55 views
4

必须有一种干式方式才能做到这一点,而无需对File.open进行两次单独调用,也无需偷看的permissions的默认值是多少。对?在Ruby中传递父项到子项的可选参数

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 

回答

4

使用图示(即*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 

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

+0

打我吧。我在考虑`args = [path,'w',permissions] .reject(&:nil?)`和`File.open(* args)`,但这不必要的复杂,单独的`extra_args`更好。 – 2011-12-15 18:07:21

1
File.open(path, 'w') do |f| 
    f.puts(contents) 
    f.chmod(permission) if permission 
end 
相关问题