Ruby:我可以在类方法中使用实例方法吗?

ste*_*her 11 ruby ruby-on-rails class-method instance-methods

我有一个包含这个类方法的类:

def self.get_event_record(row, participant)
  event = Event.where(
      :participant_id   => participant.id,
      :event_type_code  => row[:event_type],
      :event_start_date => self.format_date(row[:event_start_date])
  ).first

  event = Event.new(
      :participant_id   => participant.id,
      :event_type_code  => row[:event_type],
      :event_start_date => self.format_date(row[:event_start_date])
  ) if event.blank?

  event
end
Run Code Online (Sandbox Code Playgroud)

我在同一个类中也有一个实例方法:

def format_date(date)
  parsed_date = date.split('/')

  # if month or day are single digit, make them double digit with a leading zero
  if parsed_date[0].split("").size == 1
    parsed_date[0].insert(0, '0')
  end
  if parsed_date[1].split("").size == 1
    parsed_date[1].insert(0, '0')
  end

  parsed_date[2].insert(0, '20')

  formatted_date = parsed_date.rotate(-1).join("-")
  formatted_date
end
Run Code Online (Sandbox Code Playgroud)

我得到一个'未定义的方法'错误#format_date.(self起初,我没有在前面尝试过它).你能不能在同一个类的类方法中使用实例方法?

tdg*_*dgs 26

简短的回答是否定的,你不能在类方法中使用类的实例方法,除非你有类似的东西:

class A
  def instance_method
    # do stuff
  end

  def self.class_method
     a = A.new
     a.instance_method
  end
end
Run Code Online (Sandbox Code Playgroud)

但据我所知,format_date不一定是实例方法.所以写format_date就好

def self.format_date(date)
   # do stuff
end
Run Code Online (Sandbox Code Playgroud)


Yur*_*hov 5

只需创建类方法

def self.format_date (..)
  ...
end
Run Code Online (Sandbox Code Playgroud)

如果您需要实例方法,则将其委托给类方法

def format_date *args
  self.class.format_date *args
end
Run Code Online (Sandbox Code Playgroud)

而且我认为从类范围调用实例方法不是一个好主意

  • 这并不意味着在关键字“ class”上调用它会做任何事情,但会产生语法错误。你需要`自我`。 (2认同)