Аргумент, который может быть представлен как позиционным, так и ключевым способом? - PullRequest
1 голос
/ 14 февраля 2020

В Python позиционный аргумент всегда можно указать в качестве ключевого аргумента (мы не копаемся в расширениях Python - C, где это может быть ложным):

def foo(bar=None):
    print(bar)

foo("aaa")
foo(bar="aaa")

Я хочу добиться того же эффекта, что и bar в Ruby. Однако ни bar = nil, ни bar: nil не работают:

  • def foo bar = nil только для позиции, и аргументы, переданные как foo(key: value), будут собраны в Ha sh и предоставлены в качестве следующей позиции аргумент, тогда как foo(bar = value) вместо этого присваивает локальной переменной bar и передает ее позиционно (вместо сопоставления имени аргумента).
  • def foo bar: nil только для ключевых слов. Нет способа предоставить bar, кроме как в форме f(bar: value)

Боюсь, что в Ruby невозможно иметь аргумент, который может быть передан как позиционно, так и по ключевым словам.

Мне нужно работать только с Ruby 2.5 и более поздними версиями.

1 Ответ

0 голосов
/ 14 февраля 2020

Ближайшее, что вы получите в Ruby:

def foo(bar=nil, **kwargs)
  bar = bar || kwargs[:bar]
end

Что не очень хорошо, поскольку метод теперь принимает любой аргумент ключевого слова.

Ruby не позволяет дублировать имя аргумента:

irb(main):022:0> def foo(bar = nil, bar: nil)
irb(main):023:1> end
Traceback (most recent call last):
SyntaxError ((irb):22: duplicated argument name)
def foo(bar = nil, bar: nil)

И хотя это может быть хорошей функцией в Python - это не Ruby -eske. В Ruby передача ha sh методу следует тому же синтаксису, что и определение ha sh - потому что это именно то, что вы делаете.

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