2011-01-12 20 views
0

以下の3つの関数が与えられました。誰も私を助けてこれらを理解できますか? Qtを使ってアプリケーションをC++に移植しようとしていますが、これらの機能は理解できません。だから私を助けてください!
ありがとうございます。私はRUBYを初めて使い、3つの関数を理解する必要があります

機能1:

def read_key 
    puts "read pemkey: \"#{@pkey}\"" if @verbose 
    File.open(@pkey, 'rb') do |io| 
     @key = OpenSSL::PKey::RSA.new(io) 
    end 
    end 

機能2:

def generate_key 
    puts "generate pemkey to \"#{@pkey_o}\"" if @verbose 
    @key = OpenSSL::PKey::RSA.generate(KEY_SIZE) 
    # save key 
    File.open(@pkey_o, 'wb') do |file| 
     file << @key.export() 
    end 
    end 

機能3:

def sign_zip 
    puts "sign zip" if @verbose 
    plain = nil 
    File.open(@zip, 'rb') do |file| 
     plain = file.read 
    end 
    @sig = @key.sign(OpenSSL::Digest::SHA1.new, plain) 
    end 
+0

あなたは何を理解していますか? – justkt

+0

よく、第1の関数:\ "#{@ pkey_o} \これは何ですか?そして次に何を意味するのですか?コマンドラインから読み込んでいますか?次にrbスイッチは何ですか?私は、この行を全く理解していませんでした。 2番目の関数では、次のようになりました。これは何ですか? "do | file |"それはlopなのでしょうか?このファイル<< @ key.export()は、そのファイルに@keyの内容を書き込んでいますよね! 関数3:この記号()内のkey.sign()に何がありますか?@zipは、 ファイルを圧縮するパスです。 – defiant

+0

https://github.com/Constellation/crxmake/blob/master/lib/crxmake.rb – defiant

答えて

2

上記のコードについて、あなたを混乱させるおそれが2つあります。わかりやすい場合は、理解しやすくなります。

まず、@verboseと@keyはインスタンス変数で、C++プログラマが「メンバー変数」と呼ぶものです。 putsステートメントの後の "if @verbose"は、@ verboseがtrueの場合、putsのみを意味します。 @verboseは決してboolとして宣言する必要はありません - あなたはそれを使い始めるだけです。決して初期化されていなければ、それは "nil"と評価され、falseになります。

第2に、do/end部分はコードブロックです。多くのRubyメソッドはコードブロックを取り、それらのパイプ文字で宣言された変数でコードブロックを実行します。例は、 "for(int i = 0; i < array.size(); ++ i){s = array [i]; puts()のように見えるかもしれない" array.each do | s | puts s; end " (s);} "でC++。 File.openの場合、| io |オープンされたファイルインスタンスであり、 "read"はそのメソッドの1つです。

1

これらは、すべての方法です。 #{@pkey_o}は文字列補間で、インスタンス変数(pkey_o; Rubyインスタンス変数は@で始まり、クラス変数 - ここでは使用されていません - @@で始まります)の内容で置き換えられます。名前@pkeyに格納されたファイルを開く

File.open(@pkey, 'rb') do |io| 
    @key = OpenSSL::PKey::RSA.new(io) 
end 

ioにおけるファイルハンドル(ブロックローカル変数)を記憶し、その結果@keyに格納されOpenSSL::PKey::RSA.new、とそれを使用します。最後に、成功した終了かエラーの場合にブロックが終了したとき(end)、ファイルハンドルを閉じます(例外がスローされますが、まだスローされます)。これをC++に変換すると、RAIIパターンの使用はとなり、となります(Javaに行くなら、try/finallyを使用するといいでしょう)。

関連する問題