あなたの出力を得るためにさまざまな方法がたくさんあります。どれがあなたが を望んでいるかは、あなたのif
ステートメントに対するあなたの具体的な反対にかかっています。 出力を簡単にするために余分な書式設定を追加しました。 を読むことができます。
あなたは論理的論理和を好きではないと彼らは出力から結果 を分離する方法の場合は、ルックアップテーブルを使用することができます。
puts "Lookup table 1:"
lookup_table1 = {
:pos1 => %w{a b c},
:pos2 => %w{a b },
:pos3 => %w{a },
}
[:pos1, :pos2, :pos3].each { |which|
puts "\t#{which}"
lookup_table1[which].each { |x| puts "\t\t#{x}" }
}
それとも、あなたがすべての「仕事」をしたい場合は、ルックアップテーブル:
puts "Lookup table 2:"
lookup_table2 = {
:pos1 => lambda do %w{a b c}.each { |x| puts "\t\t#{x}" } end,
:pos2 => lambda do %w{a b }.each { |x| puts "\t\t#{x}" } end,
:pos3 => lambda do %w{a }.each { |x| puts "\t\t#{x}" } end,
}
[:pos1, :pos2, :pos3].each { |which|
puts "\t#{which}"
lookup_table2[which].call
}
あなたの問題はシンボルが序数ではないということであるならば、あなたは 文字列に変換することによって、それらをordinalizeことができます。
puts "Ordinals by .to_s and <="
[:pos1, :pos2, :pos3].each { |which|
puts "\t#{which}"
if which.to_s <= :pos3.to_s
puts "\t\ta"
end
if which.to_s <= :pos2.to_s
puts "\t\tb"
end
if which.to_s <= :pos1.to_s
puts "\t\tc"
end
}
それともサルはシンボル クラス(推奨されません)に比較演算子にパッチを当てることができます:
puts "Ordinals by Symbol#<="
class Symbol
def <= (x)
self.to_s <= x.to_s
end
end
[:pos1, :pos2, :pos3].each { |which|
puts "\t#{which}"
if which <= :pos3
puts "\t\ta"
end
if which <= :pos2
puts "\t\tb"
end
if which <= :pos1
puts "\t\tc"
end
}
それとも、あなたの序数値を供給するために、ルックアップテーブルを使用することができます。
puts "Ordinals through a lookup table:"
ordinal = {
:pos1 => 1,
:pos2 => 2,
:pos3 => 3,
}
[:pos1, :pos2, :pos3].each { |which|
puts "\t#{which}"
if ordinal[which] <= 3
puts "\t\ta"
end
if ordinal[which] <= 2
puts "\t\tb"
end
if ordinal[which] <= 1
puts "\t\tc"
end
}
もの私の頭の上から明らかなものです。あなたのif
のアプローチの問題点についてもっと詳しく説明しなければ、何が最善であろうと言うのは難しいです。 2番目の例は、本当に欲しいものが記号を序数にする方法であることを示しています。
2番目のコードでは、posを数字として扱うとコードが単純化されることが示唆されているようです(表示されているだけでなく、他の場所でも同様です)。 – tokland
'pos 'が':pos1'ならば、a、b、c(と改行)が出力されます。 –