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

#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