Передача необязательного аргумента от родителя к ребенку в Ruby - PullRequest
4 голосов
/ 15 декабря 2011

Должен быть СУХОЙ способ сделать это без двух отдельных вызовов 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 ]

4 голосов
/ 15 декабря 2011

Использование восклицательного знака (то есть *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 голос
/ 15 декабря 2011
File.open(path, 'w') do |f|
  f.puts(contents)
  f.chmod(permission) if permission
end
...