class C(object):
def f(self):
print self.__dict__
print dir(self)
c = C()
c.f()
Run Code Online (Sandbox Code Playgroud)
输出:
{}
['__class__', '__delattr__','f',....]
Run Code Online (Sandbox Code Playgroud)
为什么自己没有"f".__ dict__
我在pry中定义了一个函数:to_s,但是我无法调用它.这种方法在哪里,我怎么称呼它?
pry(main)> def to_s
pry(main)* 'hello'
pry(main)* end
pry(main)> to_s
=> "main"
Run Code Online (Sandbox Code Playgroud)
我的ruby版本是2.1.2
当在irb或pry中定义一个方法时,它会转到 Object.instance_methods
[1] pry(main)> def to_s
[1] pry(main)* 'hello'
[1] pry(main)* end
=> :to_s
[2] pry(main)> def hello
[2] pry(main)* 'world'
[2] pry(main)* end
=> :hello
[4] pry(main)> Object.instance_methods(false)
=> [:pry, :__binding__, :to_s, :hello]
Run Code Online (Sandbox Code Playgroud)
可以在新对象中调用这些新方法.
[6] pry(main)> Object.new.to_s
=> "hello"
Run Code Online (Sandbox Code Playgroud)
我无法在顶层调用to_s的原因是这main是一个定义a #to_s和#inspect方法的特殊对象.
[5] pry(main)> singleton_class.instance_methods(false)
=> [:to_s, :inspect]
Run Code Online (Sandbox Code Playgroud) 当我在做一些 go 练习代码时,我遇到了一个问题,一个通道可以像这样关闭两次:
// jobs.go
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground")
jobs := make(chan int, 5)
done := make(chan bool)
go func() {
for {
j,more := <-jobs
fmt.Println("receive close: ", j, more)
done <- true
}
}()
close(jobs)
<- done
}
Run Code Online (Sandbox Code Playgroud)
输出:
~ go run jobs.go
Hello, playground
receive close: 0 false
receive close: 0 false
Run Code Online (Sandbox Code Playgroud)
但是当我手动关闭频道两次时,我得到了panic: close of closed channel.
为什么上面的代码可以接收close两次?