2011-01-12 1 views
0

Мне даны три функции ниже. Может ли кто-нибудь помочь мне разобраться в этом? Я пытаюсь перенести приложение на C++ с помощью Qt, но я не понимаю этих функций. Пожалуйста, помогите мне!
Спасибо заранее.Я новичок в 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} \ what is this ?, а затем, что означает @verbose, читается ли она из командной строки? Тогда что такое rb-переключатель? (Читайте в двоичном?), Тогда выполните | IO |, whats that ?, даже если мы будем использовать pkey без знака @, это будет нормально работать? Тогда atlast OpenSSL :: PKey :: RSA.new (io) я вообще не понял эту строку. Теперь во второй функции: что делает это? «do | file |» - это лоп или что-то в этом роде? Тогда этот файл << @ key.export() будет писать содержимое @key в этот файл, я надеюсь! function 3: этот знак() в key.sign() что делает? @zip - это путь к zip файл, который я думаю. – defiant

+0

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

ответ

2

Возможно, есть две вещи, связанные с приведенным выше кодом, которые вас сбивают с толку, что, если выяснится, поможет понять это.

Во-первых, @verbose и @key являются переменными экземпляра, которые программист на C++ может называть «переменными-членами». «If @verbose» после оператора puts буквально означает, что только puts, если @verbose истинно. @verbose никогда не нужно объявлять bool - вы только начинаете его использовать. Если он никогда не инициализирован, это «ноль», который оценивает значение false.

Во-вторых, части 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 | это экземпляр файла, открытый, и «чтение» является одним из его методов.

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).