对于Ruby来说我还比较陌生,并且很难理解类方法。如果我有一个像下面这样的课程,
class Foo
def self.a
end
def self.b
end
end
如何从a
呼叫b
?
答案 0 :(得分:1)
只需使用其名称:
// Creates the first trigger
function trigger1(){
var s = SpreadsheetApp.getActive();
var dd = SpreadsheetApp.getActiveSpreadsheet();
var dashboard = dd.getSheetByName("Dashboard");
var triggerDay1 = dashboard.getRange(5,3).getValue();
//Logger.log(triggerDay1);
ScriptApp.newTrigger("emailReminders")
.timeBased()
.at(triggerDay)
.create();
}
答案 1 :(得分:0)
首先,请记住类是具有某些属性的模块。首先让我们看一下模块。 Math模块是一个内置模块。您会从文档中看到Math
没有实例方法(因此没有必要将该模块包含或添加到类中);它的所有方法都是模块方法。这意味着它们由显式接收器:Math.sqrt(10)
调用。 Math
只是 helper 方法的库,可供所有模块(因此也包括类)使用。
让我们将模块方法添加到Math
:
module Math
def Math.sqr(x)
x*x
end
end
Math.sqr(3)
#=> 9
假设我们决定将该模块的名称更改为Maths
。然后,我们将不得不重写此方法:
module Maths
def Maths.sqr(x)
x*x
end
end
如果因此,模块方法通常定义为def self.method(...)
,因为self
等于定义方法的模块。这样,如果更改模块名称,则不必重新定义模块方法。
由于类是模块,所以类方法只是模块方法的别称(尽管类方法是子类继承的),并且前述内容适用于类和类方法也是
与所有方法一样,模块方法是通过在方法的接收方之前对其进行调用的。例如,Math.sqrt(10)
。类似地,与所有方法一样,如果self
在调用时等于其接收者,则可以在不包括其接收者的情况下调用该方法(即,接收者是隐式)。仅当从定义方法的模块内部,方法外部或同一模块中定义的另一个模块方法调用该方法时,模块方法的接收方等于self
。例如,由于sqrt
是Math
中的模块方法,我可以这样写:
module Math
def Math.sqrt_times_2(x)
puts "self = #{self}"
2 * sqrt(x)
end
end
Math.sqrt_times_2(25)
# self = Math
#=> 10.0
由于类是模块,所有这些同样也适用于类方法,但是通过继承,它也扩展到了子类。要调用在类klass_method
中定义的类方法Klass
,我们可以从任何类中调用方法Klass.klass(...)
(可能后跟一个块),但是可以(并且应该)删除显式接收者Klass.
(如果从Klass
或Klass
的子类中调用)。这是一个例子。
class Klass
def self.klass_method(n)
puts "In klass_method, self = #{self}"
2 * n
end
def self.other_klass_method(n)
puts "In other_klass_method, self = #{self}"
3 * klass_method(n)
end
end
class SubKlass < Klass
def self.sub_klass_method(n)
puts "In sub_klass_method, self = #{self}"
5 * klass_method(n)
end
def sub_klass_instance_method(n)
puts "In sub_klass_instance_method, self = #{self}"
5 * self.class.klass_method(n)
end
end
Klass.klass_method(2)
# In klass_method, self = Klass
#=> 4
Klass.other_klass_method(3)
# In other_klass_method, self = Klass
# In klass_method, self = Klass
#=> 18
SubKlass.sub_klass_method(4)
# In sub_klass_method, self = SubKlass
# In klass_method, self = SubKlass
#=> 40
si = SubKlass.new
# In sub_klass_instance_method, self = #<SubKlass:0x0000586729649c70>
# In klass_method, self = SubKlass
si.sub_klass_instance_method(3)
# In klass_method, self = SubKlass
#=> 30
上面的最后一条语句表明,要从实例方法中调用类方法,必须将方法的接收者设置为等于定义该实例方法的类。