2011-01-12 59 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 2011-01-12 13:41:47

回答

2

上面的代碼可能有兩件事讓你感到困惑,如果澄清,將有助於理解它。

首先,@verbose和@key是實例變量,C++程序員可能稱之爲「成員變量」。 puts語句後面的「if @verbose」字面意思是隻有在@verbose爲true的情況下才執行put操作。 @verbose永遠不需要被聲明爲一個布爾 - 你只是開始使用它。如果它從未初始化,則它是「無」,其評估爲錯誤。

其次,do/end部分是代碼塊。許多Ruby方法需要一個代碼塊,並使用在這些管道字符中聲明的變量來執行它。一個例子是「array.each do | s | puts s; end」,它可能看起來像「for(int i = 0; i < array.size(); ++ i){s = array [i]; puts (s);}「在C++中。對於File.open,| io |是打開的文件實例,「read」是它的一個方法。

1

這些都是方法。 #{@pkey_o}是字符串插值,代替實例變量的內容(稱爲pkey_o; Ruby實例變量以@開頭,類變量 - 此處未使用 - 以@@開頭)。

File.open(@pkey, 'rb') do |io| 
    @key = OpenSSL::PKey::RSA.new(io) 
end 
打開,其名稱存儲在 @pkey文件,存儲在 io文件句柄(塊局部變量),並使用

OpenSSL::PKey::RSA.new,其結果存儲在@key。最後,它在塊結束時(在end處)關閉文件句柄,無論它是否是成功的退出或錯誤情況(在這種情況下將引發異常,但仍將拋出)。當把這個翻譯成C++時,RAII模式的使用完全是(如果你打算使用Java,我會說使用try/finally)。

相關問題