Заполнение массива из другого массива - PullRequest
2 голосов
/ 15 ноября 2011

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

def each_group_by_first_letter
  self.each do |x| 
    first_letter = []
    first_letter = x[0, 1].to_s
  end

  x = ["abcd", "efgh", "able"]
  x.each_group_by_first_letter do |letter, words|
    printf("%s: %s\n", letter, words)
  end

Ответы [ 2 ]

8 голосов
/ 15 ноября 2011

Есть несколько проблем с вашим кодом. Среди них:

  • Вы создаете массив с именем first_letter, но затем перезаписываете его строкой на следующей строке вместо добавления строки к нему. (Чтобы добавить элемент в массив, вы обычно будете использовать Array#push или Array#<<.)
  • Вы не возвращаете first_letter, что означает, что вы неявно возвращаете сам массив (при условии, что это то, чем является self - потому что это то, что Array#each возвращает).
  • Когда вы вызываете each_group_by_first_letter, вы передаете ему блок (do ...), но ваш метод не принимает или не использует блок. Вы, вероятно, хотите позвонить each по результату each_group_by_first_letter.

Несмотря на это, в классе Array уже есть необходимые инструменты - нет необходимости определять новый метод для этого.

x = [ 'abcd', 'efgh', 'able' ]

x.map {|word| word[0] }
# => [ 'a', 'e', 'a' ]
3 голосов
/ 15 ноября 2011
x = ["abcd", "efgh", "able"]
y = x.map{|e| e[0]}          # keeps x intact

или

x = ["abcd", "efgh", "able"]
x.map!{|e| e[0]}             # modifies x

 => ["a", "e", "a"] 
...