学习Ruby,寻找If语句可能的重构

时间:2012-04-22 14:53:42

标签: ruby if-statement

我有一些想法,但想得到一些其他选择。这是丑陋的:

def normal_balance
  if type.to_s == 'Asset' or type.to_s == 'Expense'
    if contra
      "Credit"
    else
      "Debit"
    end
  else
    if contra
      "Debit"
    else
      "Credit"
    end
  end
end

3 个答案:

答案 0 :(得分:2)

不完全是特定于ruby的方法,但由于您只是在给定集合中反转布尔值,您可以将布尔值表示为变量,然后只使用一个条件来获取“借记”或“信用'字符串。

def normal_balance
  debit = %w[Asset Expense].include?(type.to_s) ? !contra : contra
  debit ? "Debit" : "Credit"
end

答案 1 :(得分:1)

%w[Asset Expense].include?(type.to_s) == !!contra ? "Credit" : "Debit"

!!就是将contra强制转换为布尔值,因此我们可以使用==对其进行比较。它也可以写成

%w[Asset Expense].include?(type.to_s) ^ contra ? "Debit" : "Credit"

但那可读性较差,恕我直言。

答案 2 :(得分:0)

def normal_balance(type,con)
  contra = {:yes => 'Debit'}
  contra.default= 'Credit'
  card_type = {:Asset => contra, :Expense => contra}
  card_type.default = contra

  card_type[type.to_sym][con.to_sym]
end

这主要用于替换使用哈希的if

我不知道contra的可能值是什么,所以你应该在第一个哈希中替换它。

实际上在你的情况下你只测试contra_type。也许你应该只测试它。