当ruby'Complex'是一个类时,它如何像方法一样被调用?

当ruby'Complex'是一个类时,它如何像方法一样被调用?,ruby,Ruby,可以像调用方法一样调用Ruby核心库复杂类 Complex.class #=> Class Complex(1, 2) #=> (1+2i) 这怎么可能 我可以重写[],但不能重写 那么,您需要将初始化放在内核模块中 内核模型中定义的Ruby核心库。如果您在内核模块中定义它,那么您可以使用mixin利用这些方法,如下所示: class MyComplex def initialize( real, image ) "#{real} + #{image}i" end

可以像调用方法一样调用Ruby核心库复杂类

Complex.class #=> Class
Complex(1, 2) #=> (1+2i)
这怎么可能

我可以重写[],但不能重写


那么,您需要将初始化放在内核模块中

内核模型中定义的Ruby核心库。如果您在内核模块中定义它,那么您可以使用mixin利用这些方法,如下所示:

class MyComplex
  def initialize( real, image )
    "#{real} + #{image}i"
  end
end

module Kernel
  def MyComplex( real, image )
    MyComplex.new real, image
  end
end

class Klass < BasicObject
  include ::Kernel

  def create_object a, b
    MyComplex(a, b)
  end
end

p Klass.new.create_object 1, 2
# >> #<MyComplex:0xa01b008>

那么,您需要将初始化放在内核模块中

内核模型中定义的Ruby核心库。如果您在内核模块中定义它,那么您可以使用mixin利用这些方法,如下所示:

class MyComplex
  def initialize( real, image )
    "#{real} + #{image}i"
  end
end

module Kernel
  def MyComplex( real, image )
    MyComplex.new real, image
  end
end

class Klass < BasicObject
  include ::Kernel

  def create_object a, b
    MyComplex(a, b)
  end
end

p Klass.new.create_object 1, 2
# >> #<MyComplex:0xa01b008>

它实际上非常简单,而且这就是Ruby和Ruby库的工作方式:

class MyComplex
  def self.[](real, image) # This works.
    "#{real} + #{image}i"
  end
end

def MyComplex( real, image )
  "#{real} + #{image}i"
end

MyComplex[1,2] # "1+2i"
MyComplex(1,2) # "1+2i"

它实际上非常简单,而且这就是Ruby和Ruby库的工作方式:

class MyComplex
  def self.[](real, image) # This works.
    "#{real} + #{image}i"
  end
end

def MyComplex( real, image )
  "#{real} + #{image}i"
end

MyComplex[1,2] # "1+2i"
MyComplex(1,2) # "1+2i"


你的假设是错误的。Complex.class中的Complex是一个类,Complex1中的Complex,2是在内核上定义的方法。它们是不同的东西。

你的假设是错误的。Complex.class中的Complex是一个类,Complex1中的Complex,2是在内核上定义的方法。它们是不同的东西。

但是Ruby的复合体是类,而不是方法。我想知道当它是类时,复杂度有多像方法。@JecholLee:解析器发现常量复杂度作为类或方法引用的不同用途,并且语言允许这种双重用途。“那么你需要将初始化放在内核模块中”-什么?这是胡说八道。请看@NeilSlater的回答,这是正确的。@NeilSlater谢谢,我现在可以理解了。Ruby在内核中定义全局函数,而不是对象,私有实例方法和模块函数。您可以使用在纯Ruby中实现同样的功能。请参阅示例。但是Ruby的复合体是类,而不是方法。我想知道当它是类时,复杂度有多像方法。@JecholLee:解析器发现常量复杂度作为类或方法引用的不同用途,并且语言允许这种双重用途。“那么你需要将初始化放在内核模块中”-什么?这是胡说八道。请看@NeilSlater的回答,这是正确的。@NeilSlater谢谢,我现在可以理解了。Ruby在内核中定义全局函数,而不是对象,私有实例方法和模块函数。您可以使用在纯Ruby中实现同样的功能。请参见示例。非常有用。谢谢。@mudasobwa你为什么要强迫我?你确定,不会有任何人回答吗?@Neil Slater我很感激你的回答,但我需要更多的时间,以便其他人也能回答。@JecholLee:没问题,如果你有时间评估所有答案,这就是so最有效的方式。我认为我的答案无论如何都不完整。真的很有帮助。谢谢。@mudasobwa你为什么要强迫我?你确定,不会有任何人回答吗?@Neil Slater我很感激你的回答,但我需要更多的时间,以便其他人也能回答。@JecholLee:没问题,如果你有时间评估所有答案,这就是so最有效的方式。我认为我的答案无论如何都不完整,我明白了。谢谢。但是,复杂似乎是在对象上定义的。Kernel.constants.include?:复杂false,Object.constants.include?:复杂的事实。我不明白你的代码在评论中的相关性。您的代码检查常量,而不是方法。方法:Complex.owner=>Kernel。我很困惑。谢谢现在我学会了主人。也谢谢你@此外,对象包括内核,所以这些方法在所有对象中都是可用的。我明白了。谢谢。但是,复杂似乎是在对象上定义的。Kernel.constants.include?:复杂false,Object.constants.include?:复杂的事实。我不明白你的代码在评论中的相关性。您的代码检查常量,而不是方法。方法:Complex.owner=>Kernel。我很困惑。谢谢现在我学会了主人。也谢谢你@此外,对象包括内核,所以这些方法在所有对象中都是可用的
class MyComplex
  def self.[](real, image) # This works.
    "#{real} + #{image}i"
  end
end

def MyComplex( real, image )
  "#{real} + #{image}i"
end

MyComplex[1,2] # "1+2i"
MyComplex(1,2) # "1+2i"