что делают скобки, когда это рядом с итеративной функцией? - PullRequest
0 голосов
/ 14 июля 2020

Что означает [], когда он находится рядом с итеративной функцией. Без ключей и значений, например { |char| count[char] += 1 }

Ответы [ 4 ]

0 голосов
/ 15 июля 2020

TL; DR: obj[...] вызывает метод [] на obj (с аргументами ...)

Ваш фрагмент кода, вероятно, используется для подсчета вхождений символов в строку:

str = 'hello world'
count = Hash.new(0)
str.each_char { |char| count[char] += 1 }

count
#=> {"h"=>1, "e"=>1, "l"=>3, "o"=>2, " "=>1, "w"=>1, "r"=>1, "d"=>1}

Здесь count - это ha sh со значением по умолчанию 0.

Внутри блока char - это один из символов строки, т.е. "h", "e", "l" et c.

Скобки - это синтаксис c сахар для вызов метода : Hash#[] (ссылка на элемент). Но есть еще один вызов скрытого метода. В Ruby, a += b - это синтаксис c сахар для a = a + b. Итак, count[char] += 1 на самом деле:

count[char] = count[char] + 1

Левая часть - Hash#[]= (присваивание элемента).

0 голосов
/ 14 июля 2020

Syntacti c Sugar: Программисты используют термин syntacti c sugar для обозначения специальных правил, которые позволяют писать код таким образом, который не соответствует обычным правилам, но который легче запомнить. как сделать и выглядит лучше.

Они называются "синтаксисом c сахаром". Судя по названию, это способ «подсластить» некоторый синтаксис, который в противном случае мог бы выглядеть громоздким. Для объекта, который вы можете перебирать (повторяемый или перечисляемый), например хэши и массивы, вы можете использовать [] для доступа к позициям по именам или ключам.

Для ha sh, который выглядит так:

hash = {a: "A", b: "B" }

вы можете сделать hash[:b], чтобы получить "B".

Если бы у вас был массив с именем array, вы могли бы получить доступ к элементу в позиции " x "примерно так: array[x-1].

0 голосов
/ 14 июля 2020

Объяснение некоторых частей синтаксиса блока

{ |char| count[char] += 1 } - это блок . Если вы новичок в Ruby, это может помочь думать о блоке как о разновидности анонимной функции, но на самом деле это языковая функция, отличная от Pro c и лямбда-объектов. Все методы в Ruby неявно принимают блок в качестве своего последнего аргумента, независимо от того, используют они его или нет.

Внутри блока |char| объявляет переменную, которая будет содержать значения, переданные в блок. Различные языковые функции, которые передают значения блокам, передают свои значения объявленным таким образом переменным.

count[char] - это просто поиск Ha sh или массива. Он извлекает значение в count , связанное с ключом или индексом в char . В вашем конкретном примере c значение в count[char] должно быть целым числом, иначе выражение, вероятно, вызовет исключение TypeError.

0 голосов
/ 14 июля 2020

[] используются для доступа к позициям в массиве или ключам в ha sh. в этом случае вы вводите символ позиции или соответствующий ключ на этой итерации

#example
my_array = ['hola', 'chao', 'brb']
my_array[0] #show "hola"

3.times {|x| p my_array[x]} 
#"hola"
#"chao"
#"brb"
#=> 3 
...