簡體   English   中英

Ruby:我可以在類方法中使用實例方法嗎?

[英]Ruby: Can I use instance methods inside a class method?

我有一個包含這個類方法的類:

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

我在同一個類中也有一個實例方法:

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

我為#format_date收到了“未定義的方法”錯誤。 (我嘗試了不self前,在第一個)。 你能不能在同一個類的類方法中使用實例方法?

簡短的回答是否定的,你不能在類方法中使用類的實例方法,除非你有類似的東西:

class A
  def instance_method
    # do stuff
  end

  def self.class_method
     a = A.new
     a.instance_method
  end
end

但據我所知, format_date不一定是實例方法。 所以寫format_date就好

def self.format_date(date)
   # do stuff
end

只需創建類方法

def self.format_date (..)
  ...
end

如果你需要實例方法,請將它委托給類方法

def format_date *args
  self.class.format_date *args
end

我不認為從類范圍調用實例方法是個好主意

你可以做YourClassName.new.format_date(your_date) ,雖然我認為很明顯你應該重構你的代碼 - 這個方法可能不屬於實例。 為什么不擴展Date類,或者將format_date作為您正在使用的類的類方法?

編輯:以下是您的代碼需要考慮的其他一些事項:

  • 你的整個format_date方法花了很多篇幅來操作日期作為字符串。 為什么不使用Ruby的Date類? 使用Date.parseDate.strptime甚至"01/01/2001".to_date可能很有用,具體取決於您的語言環境
  • 如果您確實需要創建自己的方法,請考慮為您的方法擴展String類:

     class String def to_friendly_formatted_date Date.strptime(self, "%d/%m/%y") end end "01/08/09".to_friendly_formated_date 
  • 你的類方法正在為find_or_initialize_by輔助方法哭泣:

     self.get_event_record(row, participant) find_or_initialize_by_participant_id_and_event_type_code_and_event_start_date(:participant_id => participant.id, :event_type_code => row[:event_type_code], :event_start_date => row[:event_start_date].to_friendly_formatted_date) end 

通過上帝很長,但它實現了你想要更優雅地做的事情(雖然我願意參與爭論!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM