如何从另一个类方法调用一个类方法

时间:2019-07-19 15:40:33

标签: ruby

对于Ruby来说我还比较陌生,并且很难理解类方法。如果我有一个像下面这样的课程,

class Foo
  def self.a
  end

  def self.b
  end
end

如何从a呼叫b

2 个答案:

答案 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。例如,由于sqrtMath中的模块方法,我可以这样写:

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.(如果从KlassKlass的子类中调用)。这是一个例子。

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 

上面的最后一条语句表明,要从实例方法中调用类方法,必须将方法的接收者设置为等于定义该实例方法的类。