2015-10-26 1 views
2

Я хочу создать метод, который использует блок для вычисления суммы между двумя массивами таким образом; [1,2,3] + [2,4,6] = [3,6,9].Методы с блоками - как рассчитать массивы вместе - ruby ​​

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

* редактирование. Я должен использовать метод и блок для его проведения

def arraycalc(x,y) 
    yield x,y 
end 

arraycalc([1,2,3], [2,4,6]){|x,y| x+y} 
p arraycalC#[3,6,9] 

Я все еще новичок в Ruby. Может кто-нибудь, пожалуйста, скажите мне?

ответ

1

Вы могли бы реализовать его как этот

def arraycalc a, b 
a.zip(b).map {|x, y| yield x, y} 
end 

p arraycalc([1,2], [3,4]) {|x, y| x + y} 
#=> [4, 6] 
+0

спасибо !! Не могли бы вы объяснить, что делает zip? Я очень плохо читаю код. Кроме того, есть ли более простой способ сделать это без zip? – bisuke

+0

@basukesu: вы можете попробовать прочитать [документацию] (http://ruby-doc.org/core-2.2.3/Enumerable.html#method-i-zip) для zip. –

+0

@SergioTulentsev Я сделаю это. Большое спасибо! – bisuke

3

Вы должны использовать Array#zip метод:

[1, 2, 3].zip([2, 3, 4]).map { |x, y| x + y } # => [3, 5, 7] 

Update:

def arraycalc(array1,array2) 
    result_array = array1.zip(array2) 
    result_array.map { |x, y| yield x,y } if block_given? 
end 

arraycalc([1, 2, 3], [2, 3, 4]) { |x, y| x + y } # => [3, 5, 7] 
+0

спасибо! Однако мне нужно использовать метод и блок для этого, потому что это то, что говорит домашнее задание. Вы знаете какой-либо другой способ сделать это? – bisuke

+0

@basukesu: извлеките часть zip/map в метод и передайте ему блок. –

+0

@basukesu: Вы можете использовать волокно. Публикация [здесь] (http://stackoverflow.com/questions/11057223/how-does-rubys-enumerator-object-iterate-externally-over-an-internal-iterator) дает пример, из которого вы можете получить свои собственные решение. – user1934428

2
[[1,2,3],[2,4,6]].transpose.map{|a| a.sum} 

[3,6,9]

+0

Спасибо! есть ли способ, которым я могу это сделать, используя метод a block? – bisuke

+1

Ruby не имеет метода 'Array # sum'. (Нет тега Rails.) Вам нужно '... map {| a | a.reduce (: +)} '. –

3
a = [1,2,3] 
b = [4,5,6] 

require 'matrix' 

(Vector[*a] + Vector[*b]).to_a #=> [5,7,9] 

или

(Matrix[a] + Matrix[b]).to_a #=> [5,7,9] 
Смежные вопросы