0

このチュートリアルの最初の宝石のセクションを完了しました。ただし、hola.rbをそのように変更しようとしたときの「より多くの宝石を必要とする」セクションでは、次のようになります。

class Hola
  def self.hi(language = :english)
    translator = Translator.new(language)
    translator.hi
  end
end

require 'hola/translator'

そして、このtranslator.rbファイルを追加しました:

class Hola::Translator
  def initialize(language)
    @language = language
  end

  def hi
    case @language
    when :spanish
      "hola mundo"
    else
      "hello world"
    end
  end
end

IRBでこれらのコマンドを入力すると、同じ出力が得られるはずです。

% irb -Ilib -rhola
irb(main):001:0> Hola.hi(:english)
=> "hello world"
irb(main):002:0> Hola.hi(:spanish)
=> "hola mundo"

しかし、私は適切な結果を得ていません。gemspecを変更してgemを再インストールしようとしましたが、成功しませんでした。この場合、私が間違ったことは何だと思いますか?

stanley@ubuntu:~/Github/webdev_class/ruby/hola_stanley/lib$ irb -Ilib -rhola
irb(main):001:0> Hola.hi(:english)
=> "hello world"
irb(main):002:0> Hola.hi(:spanish)
=> "hello world"
irb(main):003:0> quit
4

1 に答える 1

0

何が問題なのかわかりませんが、タイプがなく、期待したファイルを要求したのは確かですか?

コードを少し変更します。

class Hola::Translator
  def initialize(language, exceptions = false)
    @language = language
    @exceptions = exceptions
  end

  def hi
    case @language
    when :spanish
      "hola mundo"
    when :english
      "hello world"
    else
      raise ArgumentError, "Unsupported language #{@language.inspect}" if @exceptions
      "hello world"
    end
  end
end

スペイン語と英語の 2 つの言語をサポートしています。他の言語が検出され、エラーまたは代替 (英語) テキストが表示された場合は選択できます。

次の方法で開始できます。

   class Hola
     def self.hi(language = :english)
       translator = Translator.new(language, true) ## <-- Modified
       translator.hi
     end
   end

   require 'hola/translator'      

この予想の利点の 1 つは、どのファイルが実際に例外を呼び出しているかを確認できることです。

その他の注意事項:

  • Holaクラスではなく、モジュールとして定義することをお勧めします。
  • 代わりにraise、ロガーを定義してエラーを報告できます。

例:

require 'log4r'
module Hola
  LOG = Log4r::Logger.new('Hola')
  class Translator
    def initialize(language)
      @language = language
    end

    def hi
      case @language
      when :spanish
        "hola mundo"
      when :english
        "hello world"
      else
        LOG.error("Unsupported language #{@language.inspect}")
        "hello world"
      end
    end
  end

  def self.hi(language = :english)
    translator = Translator.new(language)
    translator.hi
  end

end #module Hola

p Hola.hi
p Hola.hi(:english)
p Hola.hi(:spanish)
p Hola.hi(:german)

puts "Activate Hola-warnings"
Hola::LOG.outputters << Log4r::StdoutOutputter.new('stdout')
p Hola.hi
p Hola.hi(:english)
p Hola.hi(:spanish)
p Hola.hi(:german)

ロガーをアクティブにした後、タイプインがある場合は通知されます:spanish(これは私が予想するエラーです)。

于 2012-05-19T13:58:52.763 に答える