2011-01-12 34 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)。