Разъяснение аргументов в рубрике - PullRequest
3 голосов
/ 30 ноября 2019

В последнее время я увидел подпись этой функции:

   class Foo < Bar
    def initialize(arg: {})
      ...
   end

Что означает здесь ключевое слово аргумент (arg: {}) с фигурными скобками?

Ответы [ 2 ]

3 голосов
/ 01 декабря 2019

Это просто аргумент ключевого слова с пустым хешем в качестве значения по умолчанию:

def initialize(arg: {})
  arg
end

irb(main):011:0> initialize().class
=> Hash

Хотя это действительно странно и недиоматично. До того, как в Ruby 2.0 была введена первоклассная поддержка ключевых слов, вы объявили метод, который принимает необязательный хэш опций:

def initialize(hash = {})

end

Этот аргумент должен был находиться в конце списка. Имя не имеет значения.

В Ruby 2.0 вы можете объявить метод, который принимает любое количество ключевых слов с двойным восклицательным знаком:

def initialize(**other_keyword_args)

end

Вы можете комбинировать его с аргументами позиционного и именованного ключевых слов. а также:

def initialize(a, b = 2, foo:, bar: 2, **other_keyword_args)

end

Использование initialize(arg: {}, ...) будет иметь смысл, если там, где больше параметров, и этот принимает хеш, но сам по себе это просто странно.

0 голосов
/ 01 декабря 2019

Руби не нужны скобки ({}) вокруг хэша при передаче последнего аргумента методу:

def foo(anything)
  anything       # => {:arg=>{}}
          .class # => Hash
end

foo(arg: {})

Для получения дополнительной информации см. " Вызов методов ."

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