Как не смешивать ha sh и keywordArgument в функции Ruby? - PullRequest
1 голос
/ 31 марта 2020
    def passingHash(it)
        p it
    end

    def passingKeywordArg(name: 'David', number: 15)
        p name
        p number
    end

    # We actually pass a hash here.
    passingHash(name: "hello", number: 100) # Print {:name=>"hello", :number=>100}

    # These are two arguments.
    passingKeywordArg(name: "hello", number: 100) # Print  "hello"  100

Я учусь Ruby сейчас. Я обнаружил, что эти два вызова выглядят одинаково, но их параметры совершенно разные. Является ли использование => для представления ха sh рекомендуемым способом здесь? Я посмотрел на это руководство по стилю кода и нашел => не рекомендуется использовать. Я что-то не так понял?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2020

В дополнение к ответу «Жестяного человечка», здесь приведены дополнительные сведения о передаче аргументов ключевого слова.

Ruby имеет некоторый синтаксический сахар , который переводит хэши в аргументы ключевых слов, аргументы ключевых слов в хэши.

Когда вы запускаете passingHash(name: "hello", number: 100), Ruby видит, что passingHash принимает один позиционный аргумент и переводит его в passingHash({name: "hello", number: 100}), и вы получаете один Ха sh.

Когда вы запускаете passingKeywordArg(name: "hello", number: 100), Ruby видит, что passingKeywordArg принимает аргументы ключевого слова и оставляет его в покое. Вы получаете отдельные аргументы ключевых слов.

Вы также можете написать passingKeywordArg({name: "hello", number: 100}), что Ruby будет преобразовано в аргументы ключевых слов, но это будет устарело в 2.7 и удалено в 3.0 для более.

passingKeywordArg("name" => "hello", "number" => 100) не будет работать. В этом случае вы передаете Strings как ключи. Ruby не будет превращать строки в ключевые слова. passingKeywordArg(name: "hello", number: 100) использует Символы , а не Строка в качестве ключей, Ruby будет переводить символы в ключевые слова.

В заключение: { "name" => "hello", "number" => 100 } делает Ха sh со строковыми ключами. { name: "hello", number: 100 } делает Ха sh с символьными клавишами. Ruby будет переводить символы в аргументы ключевых слов, но не в строки.

2 голосов
/ 01 апреля 2020

В учебнике не говорится, что использование => (AKA "ha sh -rocket") - это плохо, в нем говорится, что использование строк или других объектов, помимо символов (:foo), требует больше памяти.

{ :foo => 'bar' }

- это оригинальный способ определения символа в качестве ключа. Сравните эти два определения:

{ :foo => 'bar' } # => {:foo=>"bar"}
{ foo: 'bar' }    # => {:foo=>"bar"}

Мы склонны использовать foo:, потому что мы ленивый .

Символы не стоят так дорого, но это другой предмет и почему его можно найти с помощью небольшого поиска.

Как разработчики, мы должны понимать стоимость использования одного алгоритма или объекта по сравнению с другим. Использование Strings или чего-либо еще в качестве ключа имеет свое время и место, и зная, что они могут сэкономить много памяти или время разработки.

Наконец, полезны руководства по стилю; Читайте несколько из них периодически и подумайте, что они предлагают. Руководства предназначены для команд, чтобы помочь им писать в единой и последовательной манере в соответствии с хорошими методами кодирования, адаптированными для Ruby, однако они не отлиты в камне. Важно знать, почему они рекомендуются, потому что иногда нам приходится игнорировать или отклонять правила, но когда мы это сделаем, мы лучше будем готовы объяснить, почему в обзоре кода.

И, если вы ' Если вы не знакомы со стилями кодирования Ruby, я бы порекомендовал узнать о Rubocop , который является хорошим инструментом для проверки согласованного и принятого стиля программирования и выявления ошибок.

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