3

我目前正在研究about_classes.rb。我对检查的概念以及它与self的关系感到困惑。调用对象会自动返回该对象的检查方法吗?

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

self并且inspect没有特殊关系——碰巧你正在使用的“Ruby koans”教程同时教你两者。

self是一个关键字,它在方法内部计算为您调用该方法的对象。

inspect是所有对象都实现的方法,它返回对象的字符串表示。to_s还返回对象的字符串表示形式。

不同之处在于,如果可能,返回的字符串inspect通常会模仿可以创建等效对象的 Ruby 语法。inspect一般用于调试。返回的字符串to_s通常更适合显示给最终用户。

"#{expression}" 语法隐式调用to_s由评估产生的对象expression

于 2012-01-25T04:24:41.277 回答
0

在 Ruby 中,您不能“调用对象”。Inspect 类似于 Python 中的 repr() - 它显示对象的官方可调试字符串表示。需要注意的是whileputs foo调用foo.to_sp foo调用foo.inspect

为了完整起见,我将在此处添加您不能在 Ruby 中调用对象 - 没有等效于 Python 的魔术调用方法。

于 2011-06-22T15:28:19.550 回答
0

为了回答您的问题,当您在 irb 中“调用”一个对象时,类似于在该对象的检查方法的返回值上调用 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 回答