小编Dar*_*dza的帖子

class vs Class.new,module vs Module.new

有什么区别classClass.new&moduleModule.new

我知道:

  1. Class.new/ Module.new创建匿名class/ module.当我们第一次将它分配给常量时,它变成了class/的名称module.class/ module自动执行此操作.

  2. 当我们想要继承时,我们可以传递一个参数:Class.new(ancestor).当我们没有指定祖先时,它被设置为Object.class使用此语法:class A < Ancestor

  3. Class.new返回一个object.class A回报nil.同样适用于modules.

我错过了什么?

ruby

6
推荐指数
1
解决办法
588
查看次数

response_to和response_to_missing有何不同?

我对何时使用每种方法感到困惑。从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? 检查方法是否在:

  1. 当前对象。
  2. 父对象。
  3. 包含的模块。

respond_to_missing? 检查方法是否为:

  1. 通过定义method_missing: …

ruby metaprogramming

5
推荐指数
1
解决办法
2365
查看次数

记录Rebol的方言

我可以记录这样的函数:

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如果有)?我必须手动执行此操作吗?

documentation rebol

5
推荐指数
1
解决办法
116
查看次数

"收到0后"的目的

了解你的一些Erlang为伟大的好!

另一种特殊情况是超时为0时:

flush() -> 
  receive
   _ -> flush() 
  after 0 -> 
    ok 
  end
.
Run Code Online (Sandbox Code Playgroud)

当发生这种情况时,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上.

erlang

3
推荐指数
2
解决办法
2882
查看次数

Ruby在Object中寻找类变量而不是特定的类

这部分有效:

 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)

红宝石看起来@@var1Object代替Example.

我已经在Ruby 1.9.3和2.0中测试了这个代码并得到了相同的结果.

为什么会这样?
第二件事,我们可以将其关闭(因此example.get_var1不会在Object中查找类变量)吗?

ruby eigenclass

2
推荐指数
1
解决办法
227
查看次数