ローカル変数名Rubyの補間

概要

私が持っている

banana_charge_1_bananas_sold = 0
banana_charge_2_bananas_sold = 0
banana_charge_3_bananas_sold = 0
banana_charge_4_bananas_sold = 0
banana_charge_5_bananas_sold = 0

そして

sale_ticket.banana_charge

これは 1 ~ 5 の整数です。

代わりに、sale_ticket.banana_charge をローカル変数名に挿入する方法はありますか

  if sale_ticket.banana_charge == 1
    banana_charge_1_bananas_sold += number_of_scanned_bananas
  elsif sale_ticket.banana_charge == 2
    banana_charge_2_bananas_sold += number_of_scanned_bananas
  etc.

のように

banana_charge_&^{sale_ticket.banana_charge}_bananas_sold += number_of_scanned_bananas

解決策

技術的にはメタプログラミングを使用して可能です。

# frozen_string_literal: true
# pseudo-code

number_of_bananas = 5

number_of_bananas.times do |i|
  define_method "banana_charge_#{i + 1}_bananas_sold" do
    local_variable_get("banana_charge_#{i + 1}_bananas_sold")
  end

  define_method "banana_charge_#{i + 1}_bananas_sold=" do |number_sold|
    local_variable_set("banana_charge_#{i + 1}_bananas_sold", number_sold)
  end
end

banana_charge_1_bananas_sold = 10
banana_charge_2_bananas_sold = 10
banana_charge_3_bananas_sold = 10
banana_charge_4_bananas_sold = 10
banana_charge_5_bananas_sold = 10

puts banana_charge_1_bananas_sold

ただし、この目的のために設計されたデータ型が存在するため、これは非常に不適切な設計です。

配列を使用し、あなたが達成しようとしていることに基づいて、次のようにします。

# frozen_string_literal: true
# pseudo-code

number_of_bananas_sold = [1, 2, 3, 4, 5]
number_of_bananas_sold[4] #=> 5

number_of_bananas_sold[sale_ticket.banana_charge] += number_of_scanned_bananas