局部变量名称 Ruby 中的插值

问题描述 投票:0回答:1

我有

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
ruby
1个回答
0
投票

有什么方法可以将 sale_ticket.banana_charge 插入局部变量名称中,而不是去

技术上使用元编程。

# frozen_string_literal: true

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

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
© www.soinside.com 2019 - 2024. All rights reserved.