def is_ruby_pass_by_value?(foo)
foo.replace('More precisely, it is call-by-object-sharing!')
foo = 'No, Ruby is pass-by-reference.'
end
bar = 'Yes, of course, Ruby *is* pass-by-value!'
is_ruby_pass_by_value?(bar)
p bar
# 'More precisely, it is call-by-object-sharing!'
Однако это действие не имеет значения для вашего вопроса. Это не имеет никакого отношения к пропущенным ссылкам против переходящий значение.
Так внутри testarray функции, у меня есть массив arr_tree
который передается в функцию abcde
. Я изменяю значение массива внутри функции abcde
и массива печати внутри testarray
Здесь я получил измененное значение.
Вы получаете измененное значение, потому что вы изменяете значение. Это так просто. Ruby не является чистым функциональным языком программирования, он делает имеет изменяемое состояние. И если вы мутируете это состояние, тогда старое состояние исчезнет, и существует только новое состояние.
Вы писали себя:
изменить значение массива
Ну, если изменить массив, изменения массива! В вашем коде есть только один массив.
Пожалуйста, объясните, почему результаты выглядят следующим образом?
Массив изменяется, потому что вы меняете массив.
Также как я могу достичь ожидаемого результата?
Вы можете добиться результата, не изменяя массив:
def testarray
arr_tree = [1, 2, 3, 4, 5]
(1..3).each do |index|
abcde(arr_tree)
puts arr_tree[0]
end
end
def abcde(node_tree)
[node_tree.first + 100, *node_tree.drop(1)]
end
«пройти по ссылке» означает, что _assigning_ другое значение переменной будет также изменить переменную в области видимости вызывающего абонента, например, 'node_tree = []'. Это то, что Ruby не позволяет. – Stefan
Извините, но это неправильно. Ruby не проходит по ссылке. –
Когда вы говорите «прохождение по ссылке» в Ruby, это означает, что вы пытаетесь применить концепцию C++ на неправильном языке. –