1

取得TypeError: can't convert String into Integerしています。重複した回答も見つかりましたが、「パック」でこのエラーに直面しています。

その他の混乱は、ruby 1.8.7ではなく で正常に動作していることですruby 1.9.3。ここにコードがあります。私は使用していますjruby1.7.2

irb(main):003:0> length=nil
=> nil
irb(main):004:0> token_string ||= ["A".."Z","a".."z","0".."9"].collect { |r| r.to_a }.join + %q(!$:*)
=> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!$:*"
irb(main):005:0> token =  (0..(length ? length : 60)).collect { token_string[rand( token_string.size)]}.pack("c*")
TypeError: can't convert String into Integer
    from (irb):5:in `pack'
    from (irb):5
    from /home/appandya/.rvm/rubies/ruby-1.9.3-p374/bin/irb:13:in `<main>'
irb(main):006:0>

何か案が?

4

3 に答える 3

2

string[x]inRuby 1.8Fixnum(文字コード) を与え、 in1.9は を与えますsingle character string

Array#pack は、配列をバイナリ シーケンスに変換します。pack する "c*" テンプレートは、Ruby 整数の配列を 8 ビットの符号付き単語のストリームに変換します。

これが解決策です。それらはGoogleグループからのものです

1.

バックグラウンド
>> %w(a b c).pack('*c')
TypeError: can't convert String into Integer
        from (irb):1:in `pack'
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
>> [1, 2, 3].pack('*c')
=> "\x01"
>> %w(a b c).map(&:ord).pack('*c')
=> "a"
解決
irb(main):001:0> length=nil
=> nil
irb(main):002:0> token_string ||= ["A".."Z","a".."z","0".."9"].collect { |r| r.to_a }.join + %q(!$:*)
=> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!$:*"
irb(main):003:0> (0..(length ? length : 60)).collect { token_string[rand( token_string.size)]}.map(&:ord).pack("c*")
=> "rd!:!LcxU3ON57*t2s520v*zvvdflSNAgU6uq14SiD00VUDlm9:4:tJz5Ri5o"
irb(main):004:0>

2.

String's []関数の戻り値の型はFixnumin1.8でしたがString、 in1.9です:

>JRUBY_OPTS=--1.9 ruby -e "puts 'a'[0].class"
String

>JRUBY_OPTS=--1.8 ruby -e "puts 'a'[0].class"
Fixnum

JRuby 1.7.xデフォルトでは のように動作しRuby 1.9.3ます。を設定する必要がありますJRUBY_OPTS

3.

join代わりに試してくださいpack

irb(main):004:0> length=nil
=> nil
irb(main):005:0> token_string ||= ["A".."Z","a".."z","0".."9"].collect { |r| r.to_a }.join + %q(!$:*)
=> "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!$:*"
irb(main):006:0> token =  (0..(length ? length : 60)).collect { token_string[rand( token_string.size)]}.join("c*")
=> "Fc*Dc*1c*6c*ac*Kc*Tc*Qc*Hc*jc*Ec*Kc*kc*zc*sc*3c*ic*hc*kc*wc**c*Wc*$c*Kc*Ic*Uc*Cc*bc*Pc*1c*!c*mc*Bc*lc*dc*ic*Dc*sc*Ac*Bc*nc*Kc*mc*Lc*oc*Zc*Xc*jc*6c*2c*Uc*ec*Yc*Dc*vc*Ic*Uc*5c*Zc*3c*o"
irb(main):007:0>

4.

8ビットのクリーンなランダムな文字列を作成しようとしているだけなら、のRandom#bytesようなものを見たいと思うかもしれませんBase64.encode64.

5.

active_support/secure_randomにも、これらのための優れた API があります。

于 2013-02-26T00:41:59.363 に答える
0

使用するtoken = (0..(length ? length : 60)).collect { token_string[rand( token_string.size)]}.pack("a"*61)

同じ結果が得られます。0..60 から 61 の要素があるため、61 を使用しています。

于 2013-02-25T19:35:25.587 に答える
0

Array Method Packをご覧になることをお勧めします。基本的.pack("c")に、配列の要素は整数であると想定しています。あなたは試すことができます.pack("a*")

于 2013-02-25T19:23:56.720 に答える