#2 楼 @luolinae86 懂了,method_one 在被调用的时候同时定义了 method_one 方法,这样子 method_one 方法才能成为实例方法,感谢。
#17 楼 @qinfanpeng 感激,在看第一版中文的,理解好之后再啃第二版的。
#12 楼 @qinfanpeng 认真看了 module_function 的方法解释,实现了您提到的两个功能,一是作为 private instance method 方法被调用,二是可以直接用模块名进行调用。但是 send 方法为何可以被 Kernel 模块名调用,也可以直接通过对象对用,如下代码:
Kernel.public_instance_methods.grep(/send/) # [:send, :public_send]
可以知道 send 方法是 Kernel 的 public instance method 方法,那么这里又是什么原理或者方法,使得其可以通过两种方式调用,即可以通过对象调用,也可以被 Kernel 调用。
另外请教前辈,这些知识点您是怎么积累的?
#14 楼 @fighterleslie 终于把这个知识点搞的有点明白了,感激,作为周星驰的粉丝,很喜欢你的头像。
#10 楼 @fighterleslie 感谢解答,您的解答我也考虑过,同理参考问题 2 中的例子:
module KernelMdoule
def cc
puts "this is the private method"
end
private : cc
end
class FatherClass
include KernelMdoule
end
class SonClass < FatherClass
cc
end
这样的写法会报错,原因为 undefined local variable or method,您的解释为:
“你调用 cc 方法的时候,receiver 是 SonClass,而不是 SonClass 的实例,当然获取不到实例方法了
但是其实 SonClass 也是一个对象,是 Class 的实例化对象:
puts SonClass.class #Class
puts SonClass.instance_of?(Class) #true
在我的理解里面,问题二中的代码
class SonClass < FatherClass
cc
end
和
class SonClass < FatherClass
puts “this is an private instance method ”
end
的实现形式是一致的,我在问题二的代码中也实现在 module 中构造私有实例方法,并且 include 到父类中,并且在子类中直接进行调用,这和 Object、Kernel 以及其他 Class 的实例化对象(即普通类)实现方式类似,但是实现的结果却是有错的,这是我的困惑所在,也是我的理解上的误区,能不能帮忙指正一下,感谢。
#7 楼 @qinfanpeng 链接已经可以访问了
#6 楼 @fighterleslie 非常感谢。问题二中代码的错误已经进行了修改。给出问题二的代码是为了和 Kernel 中的 puts 方法做比较,比如如下的代码:
puts "method one" #当前对象是main
class KernelMethod
puts "method two" #当前对象是class KernelMethod
def method_three
puts "method three" #当前对象是obj
end
end
obj = KernelMethod.new
obj.method_threee
结合上面的小伙伴的解释,补充了私有方法不能显式调用的知识,但是在类中进行调用 puts 方法(puts "method two"),与实例方法(puts 是 private instance method)只能被实例化对象调用相违背。在该例中,puts "method two"方法可以实现,但是在我给出的问题 2 中类似的方法是不能实现的。 我应该存在理解上的误区或者知识漏洞,感谢指正。
#1 楼 @qinfanpeng 谢谢您的解答,能不能帮我看看我的理解和疑问,非常感谢。
我自己有点钻牛角尖了,不多还是想把细节搞清楚,看了原书的内容。下面有几个小问题。 问题 1:任何对象都可以调用 Kernel 模块的方法,但是下面的 obj 对象调用会报错。
class KernelDemo
end
obj = KernelDemo.new
obj.puts("this is the Kernel method") #报错private method puts
问题 2:我构造了如下的代码,在模块中定义 private method, 并且 include 到类中,并且通过子类继承该类(类似于 Kernel、Object 和普通类的关系),但是在子类中调用 private method 会报错。
module KernelMdoule
def cc
puts "this is the private method"
end
private : cc
end
class FatherClass
include KernelModule
end
class SonClass < FatherClass
cc
end
问题 3:官方文档 中所有的方法都是标为 public instance method,但是通过在 irb 中输入如下 Kernel.private_instance_methods 可以得知本页中的所有方法都是 private instance method.而
Kernel.public_instance_methods.grep(/send/) #=>[:send, :public_send]
可以得知 send 方法是 Kernel 的公有实例方法,因为 Kernel 被引入到类 object 中,因此可以像普通公开实例方法一样被对象调用,而 puts 是私有实例方法,可以像关键词一样调用。如果是这样,那么文档中的表述是否有问题:
The Kernel instance methods are documented in class Object while the module methods are documented here. These methods are called without a receiver and thus can be called in functional form:
终端测试了下:
“/u80".bytesize= 1, "/u3042".bytesize=3
#1 楼 @spacewander 恩,谢谢,是这个原因。
是哪几本书,方便透露么?
#1 楼 @MrPasserby 添加了 rails s -b 0.0.0.0 语句,但是没有成功,ubuntu 的防火墙设置不知如何下手
#7 楼 @chulielee 没有用你的方法,过了几天试这个程序,发现可以用了
#5 楼 @regantechjobs 其实给个具体的数会让您的招聘更有诚意。
待遇呢
#7 楼 @48hour 那这句话应该是错得了““这个类被存储在一个名为@time_class的类实例变量中”