2

要查看谁在扮演selfin的角色nested methods,我尝试了以下代码:

def test
  p "#{self}"
  def show
    p "#{self}"
  end
end
# => nil

作为效果,我得到了以下两个对象:

Object.new.test
"#<Object:0x00000002212d78>"
# => nil
Object.new.test.show
"#<Object:0x00000002205330>" #<~~~ this is self understood
"" #<~~~ how this one came?
# => ""

但是从编码的数字来看,我无法理解这些对象属于哪个类。我尝试了下面的代码并获得了各自的class名称。

Object.new.test.class
"#<Object:0x000000021ff3b8>"
# => NilClass
Object.new.test.show.class
"#<Object:0x000000020660b0>"
""
# => String

那么任何人都可以帮助我理解上述代码如何产生这些class名称的概念吗?

编辑

在这里,我试图以更具体的方式提出我的问题:

def test
p "First level # => #{self}"
def show
p "Second level # => #{self}"
end
end
# => nil
Object.new.test.show
"First level # => #<Object:0x000000014a77b0>"
"Second level # => "
# => "Second level # => "
Object.new.test.show.class
"First level # => #<Object:0x0000000130ef70>"
"Second level # => "
# => String

为什么p "Second level # => #{self}"声明self有价值""

4

5 回答 5

3

Object.new.test.show 调用 Object.new.test 对象中的 show 方法。

Object.new.test 返回 nil(因为 p 返回 nil),但同时它在 Object 类中添加了 show 方法的定义。

由于 nil 属于 NilClass 类,它是 Object 的子类,所以 nil 现在已将 show 作为方法,因此您实际上可以在 nil 中调用 show。

当你做 Object.new.test.show 相当于然后做

nil.show

当在 show 中执行 p "#{self}" 时,实际上是在打印 nil.to_s

nil.to_s is ""

这就解释了你看到的那个神秘的“”。

于 2013-02-26T19:42:51.353 回答
1

这很简单:

def show
  p "#{self}"
end

nilreturn ,即def部分,这就是为什么该test方法返回一个对象nil,一个NilClass. 在该show方法中,您正在执行p "#{self}"的操作将返回一个字符串对象,该对象是String该类的一个实例。

于 2013-02-26T18:05:53.483 回答
1

试试这个 :

class FooBar
  def foo
    puts self.class
    puts self
    def bar
      puts self.class
      puts self
    end
    bar
  end
end


FooBar.new.foo

我有 :

FooBar
#<FooBar:0x007fc413849818>
FooBar
#<FooBar:0x007fc413849818>

由于分配了不同的对象,因此得到了不同的结果。

self返回定义方法的对象,即使它是嵌套方法。

于 2013-02-26T18:07:45.543 回答
0

尝试使用:self.class.to_s。所以要我输入额外的字符,所以 [:

于 2013-02-26T18:06:16.693 回答
0

我们都知道—— self inside a method is always the object on which the method was called。所以让我们试着检查一下它的真实性。

self让我们首先从下面的代码中看看谁是默认的:

m=self
# => main
m.class
# => Object

好的,默认selfObject类的对象。

只是从提到的代码描述中以更简化的方式编写了以下代码,以突出概念。

def test
p self.class
def show
p self.class
end
end
# => nil

请记住,仅按以下方式self inside a method is always the object on which the method was called调用。test

test
Object
# => nil

是的,Object已经返回,在其上test调用了,这意味着上面的陈述是正确的。

test.show
Object
NilClass
# => NilClass

由于阻塞,调用 totest也会返回.Now是 .Now 的对象。因此方法已在对象上调用。结果是。上述说法再次成立。nildef show;p self.class;endnilNilClassshowNilClassselfNilClass

上面的概念试图通过微小的步骤达到实际目标:

def test
p "1. # => #{self}"
def show
p "2. # => #{self}"
end
end
# => nil

test
"1. # => main" #<~~ main is an object of class Object,on which test was called from IRB.
# => nil

test.show
"1. # => main"
"2. # => "    #<~~ nil("" means nil.to_s) is an object of Nilclass,on which show was called from IRB.
# => "2. # => "
于 2013-02-26T20:06:55.747 回答