2017-08-29 28 views
-6

看來Time.zone.local確實是你想象的Time.zone.new會做的。雖然,Time.zone.new不存在。爲什麼這個獨特的命名偏離了標準?爲什麼叫'Time.zone.local'而不是'Time.zone.new'?

更新: 問題是關於理解Rails爲什麼會偏離使用.new來實例化某個特定類型的新對象時的慣例。通過使用例如Time.zone.local(2013,10,1)而不是即Time.zone.new(2013,10,1)來獲得TimeWithZone對象。

+0

你指的是['now'](http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-now)而不是'new'嗎? – schmijos

+0

@ndn不是'ActiveSupport :: TimeZone',而是'Time',對嗎? – schmijos

+0

我投票結束這個問題作爲題外話,因爲它與編程無關。 – kabanus

回答

2

並非每個返回新值的方法都被稱爲new

通常,預計new始終是一個返回該類的新實例的類的方法。然而,使用Time.zone.localTime.zone不是一個類,而是ActiveSupport::TimeZone的一個實例。將其定義爲new將是相當具有誤導性的,因爲這意味着Time.zone返回一個類而不是對象實例。

因此,ActiveSupport::TimeZone#local是在「本地」(即選定)時區中創建新實例的方法的明智名稱。在通常的Rails上下文中,您將設置Time.zoneto the current user's timezone,調用Time.zone.local(...)的模式因此清楚了這裏發生了什麼:在用戶的本地時區中創建一個新的類似時間的對象。

+2

這也意味着Time.zone.new會返回一個Time.zone類的實例,即TimeZone實例而不是TimeWithZone實例。 – Stefan