Я новичок в RUBY и мне нужно понять 3 функции - PullRequest
0 голосов
/ 12 января 2011

Мне дали 3 функции ниже. Кто-нибудь может помочь мне понять это? Я пытаюсь портировать приложение на C ++, используя Qt, но я не понимаю этих функций. Поэтому, пожалуйста, помогите мне!
Заранее спасибо.

функция 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

Ответы [ 2 ]

2 голосов
/ 12 января 2011

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

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

Во-вторых, части do / end являются кодовыми блоками. Многие методы Ruby принимают блок кода и выполняют его с переменной, объявленной в этих символах канала. Примером может быть «array.each do | s | put s; end», который может выглядеть как «для (int i = 0; i

1 голос
/ 12 января 2011

Это все методы.#{@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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...