3

私は現在about_classes.rbに取り組んでいます。inspectの概念とそれがselfにどのように関係しているかについて混乱しています。オブジェクトを呼び出すと、そのオブジェクトのinspectメソッドが自動的に返されますか?

class Dog7
    attr_reader :name

    def initialize(initial_name)
      @name = initial_name
    end

    def get_self
      self
    end

    def to_s
      __
    end

    def inspect
      "<Dog named '#{name}'>"
    end
  end

  def test_inside_a_method_self_refers_to_the_containing_object
    fido = Dog7.new("Fido")

    fidos_self = fido.get_self
    assert_equal __, fidos_self
  end

  def test_to_s_provides_a_string_version_of_the_object
    fido = Dog7.new("Fido")
    assert_equal __, fido.to_s
  end

  def test_to_s_is_used_in_string_interpolation
    fido = Dog7.new("Fido")
    assert_equal __, "My dog is #{fido}"
  end

  def test_inspect_provides_a_more_complete_string_version
    fido = Dog7.new("Fido")
    assert_equal __, fido.inspect
  end

  def test_all_objects_support_to_s_and_inspect
    array = [1,2,3]

    assert_equal __, array.to_s
    assert_equal __, array.inspect

    assert_equal __, "STRING".to_s
    assert_equal __, "STRING".inspect
  end
4

3 に答える 3

2

selfinspect特別な関係はありません。たまたま、あなたが使用している「Ruby koans」チュートリアルが両方について同時に教えてくれます。

selfメソッド内で、メソッドを呼び出したオブジェクトに評価されるキーワードです。

inspectオブジェクトの文字列表現を返す、すべてのオブジェクトによって実装されるメソッドです。to_sオブジェクトの文字列表現も返します。

違いは、によって返される文字列は、inspect一般に、可能であれば、同等のオブジェクトを作成できる Ruby 構文を模倣することです。inspect通常、デバッグに使用されます。によって返される文字列to_sは、通常、エンド ユーザーへの表示に適しています。

to_s"#{expression}" 構文は、 を評価した結果のオブジェクトを暗黙的に呼び出しますexpression

于 2012-01-25T04:24:41.277 に答える
0

あなたの質問に答えるために、irb でオブジェクトを「呼び出す」と、そのオブジェクトの inspect メソッドの戻り値に対して puts が呼び出されるのと似ています。これは実際に起こっていることかもしれませんし、そうでないかもしれませんが、あなたがそれを真似できる唯一の方法です。次の例を試してください。

"Hello"
=> "Hello"

puts "Hello"
=> Hello

class MyClass
  def inspect
    "Hello"
  end
end

a = MyClass.new
=> Hello

a.inspect
=> "Hello"

puts a
=> Hello
于 2011-09-14T15:13:51.827 に答える
0

Ruby では「オブジェクトを呼び出す」ことはできません。Inspect は Python の repr() に似ています。これは、オブジェクトの正式なデバッグ可能な文字列表現を示します。puts fooを呼び出している間foo.to_s、をp foo呼び出していることに注意してくださいfoo.inspect

完全を期すために、Ruby ではオブジェクトを呼び出すことができないことをここに追加しておきます。Python のマジックコールメソッドに相当するものはありません。

于 2011-06-22T15:28:19.550 に答える