#ruby
#ruby
Вопрос:
Представьте себе это:
x_1 = "this is my dog"
x_2 = "this is my house"
Я знаю, что если вы хотите получить длину этих переменных, которые вам нужно использовать .length
.
Интересно, есть ли другой способ добиться этого. Эти две переменные имеют похожие обозначения — отличается только последний символ. Я хочу сделать что-то подобное:
["1","2"].each do |end|
puts (x_1 end).length
end
Это неправильно, я знаю, но я думаю, вы поняли, что я хочу сделать.
У вас есть какие-либо идеи?
Комментарии:
1. Всякий раз, когда у вас возникает соблазн назвать переменные
x_1
и т.x_2
Д., Это намек на то, что вы, вероятно, захотите использоватьArray
илиHash
вместо этого.
Ответ №1:
Есть ли другой способ вызвать метод для переменных, которые имеют похожие обозначения?
Вы не вызываете методы для переменных. Вы вызываете методы для объектов. Это чрезвычайно важное различие. Переменные и объекты принципиально разные, и понимание того, как и почему вещь и имя вещи не совпадают, чрезвычайно важно не только в Ruby, но и в программировании (и даже в жизни) в целом.
Я знаю, что если вы хотите получить длину этих переменных, вам нужно использовать ‘.length’.
Вы не можете получить длину переменной. Переменная не имеет «длины». Вы можете получить только длину объекта, а не переменную.
Интересно, есть ли другой способ добиться этого.Эти две переменные имеют похожие обозначения — отличается только последний символ.
Да, можно разыменовать переменную, используя имя, которое вы динамически создаете с помощью Binding#local_variable_get
метода:
b = binding
%w[1 2].each do |suffix|
puts b.local_variable_get(:"x_#{suffix}").length
end
Однако выполнение чего-то подобного почти всегда является признаком неправильного дизайна.
Если у вас есть ряд переменных с последовательными именами, это почти всегда какая-то последовательная структура данных, которая хочет выйти, например:
xs = ['this is my dog', 'this is my house']
xs.each do |string|
puts string.length
end
Ответ №2:
Я не уверен, правильно ли я понял, что вы хотите, но:
["1","2"].each do |number|
puts binding.local_variable_get("x_#{number}").length
end
Он будет печатать следующий:
14
16