В методе, который принимает несколько необязательных параметров, как можно указать любой, кроме первого? - PullRequest
9 голосов
/ 30 марта 2009

У меня есть такой метод:

def foo(fruit='apple', cut="sliced", topping="ice cream")
  # some logic here
end

Как я могу назвать его, когда я только переопределяю параметр topping, но использую значения по умолчанию для остальных, что-то вроде этого

foo('','','hot fudge')

Конечно, это работает не так, как задумано, но я хочу предоставить только значение для третьего необязательного параметра и иметь первые две флешки со своими значениями по умолчанию. Я знаю, как сделать это с помощью хэша, но является ли это быстрым способом, используя приведенный выше синтаксис?

Ответы [ 3 ]

21 голосов
/ 28 февраля 2015

Начиная с Ruby 2.0, вы можете использовать ключевые аргументы:

def foo(fruit: 'apple', cut: "sliced", topping: "ice cream")
  [fruit, cut, topping]
end

foo(topping: 'hot fudge') # => ['apple', 'sliced', 'hot fudge']
18 голосов
/ 30 марта 2009

Вы не можете использовать этот синтаксис, чтобы сделать это в ruby. Я бы порекомендовал синтаксис хеша для этого.

def foo(args={})
  args[:fruit]    ||= 'apple'
  args[:cut]      ||= 'sliced'
  args[:topping]  ||= 'ice cream'
  # some logic here
end

foo(:topping => 'hot fudge')

Вы также можете сделать это, используя позиционные аргументы:

def foo(fruit=nil,cut=nil,topping=nil)
  fruit    ||= 'apple'
  cut      ||= 'sliced'
  topping  ||= 'ice cream'
  # some logic here
end

foo(nil,nil,'hot fudge')

Помните, что оба эти метода не позволяют передавать действительные nil аргументы в функции (когда вы можете захотеть иногда)

2 голосов
/ 30 марта 2009

Нет. Вы должны проверить значение параметров внутри функции foo. Если они являются пустой строкой или пустыми, вы можете установить для них значение по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...