0

@chem_species = ["H2", "S", "O4"]配列を反復処理し、定数に存在する定数の量を掛けようとしてH = 1.01 * 2, S = 32.1 * 1います。もちろん、定数はインスタンスメソッドの前のクラス内で定義されます。

これを行うために作成したコードは機能しません。

def fw
x = @chem_species.map { |chem| chem.scan(/[A-Z]/)}
y = @chem_species.map { |chem| chem.scan({/\d+/)}
@mm = x[0] * y[0] 
end

収量->TypeError: can't convert Array into Integer

これをより適切にコーディングする方法について何か提案はありますか?よろしくお願いします。

4

5 に答える 5

3

すべてを1回のスキャンとマップで実行するのはどうですか?このString#scanメソッドは、一致した文字列の配列を常に返します。これを見てください:

irb> "H2".scan /[A-Z]+|\d+/i
  => ["H", "2"]

だからあなたのすべての@chem_species使用にそれを適用するだけmapです:

irb> @chem_species.map! { |chem| chem.scan /[A-Z]+|\d+/i }
  => [["H", "2"], ["S"], ["O", "4"]]

OK、マップオーバーし@chem_species、各要素シンボルをその定数の値に変換し、各係数を整数に変換します。

irb> H = 1.01
irb> S = 32.01
irb> O = 15.99
irb> @chem_species.map { |(elem, coeff)| self.class.const_get(elem) * (coeff || 1).to_i }
  => [2.02, 32.01, 63.96]

あなたのモル質量があります!

ちなみに、各元素の複数の定数ではなく、単一のハッシュ定数でモル質量を調べることをお勧めします。このような:

MASSES = { :H => 1.01, :S => 32.01, :O => 15.99 }

次に、その最後のマップは次のようになります。

@chem_species.map { |(elem, coeff)| MASSES[elem.to_sym] * (coeff || 1).to_i }
于 2010-07-23T00:17:15.153 に答える
0

コードに構文エラーがあります:多分それは次のようになります:

def fw
x = @chem_species.map { |chem| chem.scan(/[A-Z]/)}
y = @chem_species.map { |chem| chem.scan(/\d+/)}
@mm = x[0] * y[0] 
end
于 2010-07-23T00:02:58.623 に答える
0

@chem_species.map { |chem| chem.scan(/[A-Z]/)}の出力(またはそのことについては2番目の出力)を見ましたか?それはあなたに配列の配列を与えるので、あなたが本当にこのアプローチに固執したいのならあなたはしなければならないでしょうx[0][0]

mappingを実行する 代わりに、each

@chem_species.each { |c| c.scan(/[A-Z]/) }

編集:それは私が思っていたようにはまったく機能しなかったことに気づきました、愚かな答えについての私の謝罪:P

于 2010-07-23T00:04:29.947 に答える
0

値を取得したら、これを乗算する方法は次のとおりです。*演算子は配列では機能しません。

x = [ 4, 5, 6 ]
y = [ 7, 8, 9 ]
res = []
x.zip(y) { |a,b| res.push(a*b) }
res.inject(0) { |sum, v| sum += v}
# sum => 122

または、仲買人を切り取る:

x = [ 4, 5, 6 ]
y = [ 7, 8, 9 ]
res = 0
x.zip(y) { |a,b| res += (a*b) }
# res => 122
于 2010-07-23T00:13:32.637 に答える
0

(ワンライナーアラート、トピック外アラート)

式を直接解析できます。

"H2SO4".scan(/([A-Z][a-z]*)(\d*)/)
# -> [["H", "2"], ["S", ""], ["O", "4"]]

部分和を計算します。

aw = { 'H' => 1.01, 'S' => 32.07, 'O' => 16.00 }
"H2SO4".scan(/([A-Z][a-z]*)(\d*)/).collect{|e,x| aw[e] * (x==""?1:x).to_i}
# -> [2.02, 32.07, 64.0]

合計:

"H2SO4".scan(/([A-Z][a-z]*)(\d*)/).collect{|e,x| aw[e] * (x==""?1:x).to_i}.inject{|s,x| s+x}
# -> 98.09
于 2010-07-23T00:30:42.050 に答える