有什么区别class和Class.new&module和Module.new?
我知道:
Class.new/ Module.new创建匿名class/ module.当我们第一次将它分配给常量时,它变成了class/的名称module.class/ module自动执行此操作.
当我们想要继承时,我们可以传递一个参数:Class.new(ancestor).当我们没有指定祖先时,它被设置为Object.class使用此语法:class A < Ancestor
Class.new返回一个object.class A回报nil.同样适用于modules.
我错过了什么?
我对何时使用每种方法感到困惑。从respond_to?文档:
如果obj响应给定的方法,则返回true 。仅当可选的第二个参数的值为true时,私有方法才包含在搜索中。
如果未实现该方法,例如Windows上的Process.fork,GNU / Linux上的File.lchmod等,则返回false。
如果未定义方法,则response_to_missing?方法被调用并返回结果。
和respond_to_missing?:
Hook方法,返回obj是否可以响应id方法。
请参阅#respond_to?。
两种方法都带有两个参数。
两种方法似乎都是同一件事(检查某个对象是否响应给定的方法),为什么我们应该同时使用(拥有)这两种方法呢?
定义“ resond_to_missing?”使您能够采用方法:
class A
def method_missing name, *args, &block
if name == :meth1
puts 'YES!'
else
raise NoMethodError
end
end
def respond_to_missing? name, flag = true
if name == :meth1
true
else
false
end
end
end
[65] pry(main)> A.new.method :meth1
# => #<Method: A#meth1>
Run Code Online (Sandbox Code Playgroud)
为什么respond_to?不能这样做?
respond_to? 检查方法是否在:
respond_to_missing? 检查方法是否为:
method_missing: …我可以记录这样的函数:
f: func [
"a description"
arg1 [string!] "a description of an argument 1"
][
arg1
]
Run Code Online (Sandbox Code Playgroud)
我可以使用?/ help来检索有关函数的信息(描述,用法,参数列表,每个参数的描述及其类型)
? f
USAGE:
F arg1
DESCRIPTION:
a description
F is a function value.
ARGUMENTS:
arg1 -- a description of an argument 1 (Type: string)
Run Code Online (Sandbox Code Playgroud)
我无法记录这样的方言.是否有自动记录方言的方式(func如果有)?我必须手动执行此操作吗?
另一种特殊情况是超时为0时:
Run Code Online (Sandbox Code Playgroud)flush() -> receive _ -> flush() after 0 -> ok end .当发生这种情况时,Erlang VM将尝试找到适合其中一种可用模式的消息.在上面的例子中,任何匹配.只要有消息,该
flush/0函数将递归调用自身,直到邮箱为空.完成此操作后,将after 0 ->执行代码的ok部分并返回该函数.
我不明白的目的after 0.阅读上面的文字后,我认为它就像after infinity(永远等待),但我改变了一点刷新功能:
flush2() ->
receive
_ -> timer:sleep(1000), io:format("aa~n"), flush()
after 0 ->
okss
end
.
flush3() ->
receive
_ -> io:format("aa~n"), flush()
after 0 ->
okss
end
.
Run Code Online (Sandbox Code Playgroud)
在第一个函数中它等待1秒,在第二个函数中它不等待.
在这两种情况下,它都不显示文本(aa~n).
所以它不起作用after infinity.
如果不执行receive和之间的阻塞,after则上述2个代码可以简化为:
flush4() ->
okss
.
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
PS.我在Erlang R16B03-1上,我记得这本书的作者是在Erlang R13上.
这部分有效:
class Example1
@@var1= "var1 in the Example1"
def get_var1
@@var1
end
end
example1 = Example1.new
example1.get_var1
# => "var1 in the Example1"
Run Code Online (Sandbox Code Playgroud)
但如果我尝试eigenclass:
def example1.get_var1
@@var1
end
example1.get_var1
# NameError: uninitialized class variable @@var1 in Object
# from (pry):128:in `get_var1'
Run Code Online (Sandbox Code Playgroud)
红宝石看起来@@var1在Object代替Example.
我已经在Ruby 1.9.3和2.0中测试了这个代码并得到了相同的结果.
为什么会这样?
第二件事,我们可以将其关闭(因此example.get_var1不会在Object中查找类变量)吗?