当我在上面创建对象时,是否首先调用initliase方法? 在PHP中,我们有一个叫做构造函数的东西,每当创建一个对象时首先运行,如果类中有多个方法,在ruby中首先调用哪个方法怎么办?
感谢。
答案 0 :(得分:1)
Class#new
只是一种常规方法,就像任何其他方法一样。它看起来有点像这样,虽然在大多数实现中它实际上不是用Ruby编写的:
df = pd.DataFrame.from_dict( {'a':[0,1,2],
'a_name':['a','b','c'],
'percentage':[.1,.2,.3]})
p = ggplot.ggplot(data=df,
aesthetics=ggplot.aes(x='a',
y='percentage'))\
+ ggplot.geom_point()\
+ ggplot.scale_x_continuous(breaks=list(df['a']),
labels=list(df['a_name']))
文档也清楚地说明了:
class Class def new(*args, &block) new_obj = allocate new_obj.initialize(*args, &block) # actually, `initialize` is private, so it's more like this instead: # new_obj.__send__(:initialize, *args, &block) return new_obj end end
→new(args, …)
调用
obj
创建类类的新对象,然后调用该对象的allocate
方法,并将其传递给 args 。这是在使用initialize
构造对象时最终调用的方法。
以下是各种实现中.new
的源代码:
machine/builtin/class.cpp
core/src/main/java/org/jruby/RubyClass.java
topaz/objects/classobject.py
src/kernel/bootstrap/Class.rb
object.c
(顺便说一句,你会注意到这个方法是在Class#new
中定义的,而不是在object.c
中。这是我喜欢不的原因之一em>查看YARV的实现细节,而不是看看Rubinius,JRuby,IronRuby或Topaz。它们组织得更好。)答案 1 :(得分:0)
只要您拨打initialize
,就会调用new
方法。
应该在代码中调用该类中声明的任何其他方法。
例如:
class Example
def initialize
#some initialization code here
puts "initialize method has just been called"
end
def foo
#some foo code
puts "this is the foo method"
end
end
然后,在你的代码中:
my_obj = Example.new #initialize method will be called here
my_obj.foo #now the foo method will be called
就是这样,祝你好运!