为了账号安全,请及时绑定邮箱和手机立即绑定

Ruby一些小case总结

标签:
Ruby


case1。

Ruby中文社区有个小问题:

==================================

比较下面两段代码:

CODE:

class << Object   

  def attr_init(name, klass)     

    define_method(name)

       { eval "@#{name} ||= #{klass}.new" }   

    end 

end

----------------------------------

CODE:

class << Object

   def attr_init(name, klass)

     eval "define_method(name) { @#{name} ||= #{klass}.new } "

   end

end

请问:

这两段代码效率孰高孰低?原因何在?

==================================

问题涉及到Ruby解释器工作机制,eval和元编程,但没有那么复杂!

可以看看两段代码的执行效率(可以用benchmark来测试):

                           user           system      total            real

inner eval         0.670000   0.000000    0.670000 (  0.774050)

outer eval         1.590000   0.000000    1.590000 (  1.637992)

eval1                 0.590000   0.000000     0.590000 (  0.644324)

eval2                 0.090000   0.000000     0.090000 (  0.133628)

第一段代码执行eval的效率比第二段高,原因是因为因为第二段比第一段多了个define_method过程;方法调用的时候,第一段就明显不如第二段快了,原因是因为第一段代码,在定义期间,不会执行define_method块的代码,所以不会执行eval,第二段代码,却是执行了eval,在方法调用的时候,第一 段代码会执行eval,第二段代码不会执行eval,对于已经执行过的代码解释器会有记录而不会重新解释。

具体源码可以去看:

[url]http://ruby-lang.org.cn/forums/viewthread.php?tid=714&extra=page%3D1[/url]

case2。中文格式化时间日期

有两种方法:

1。在environment.rb文件中,加入下面一行代码:

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.update(:default => '%Y 年 %m 月 %d 日' @ %H : %m %P)  

可是这样 页面输出:2007 年 08 月 09 日 @ 11 09 am

那个am如何转换为上午呢?那么还需要配合一个helper方法:

 def toChinaTime(time=Time.now)

       @timehelp = time.strftime((time.strftime("%p") == "AM" ? "上午" : "下 午" ) + " %H:%M")   

  end

在页面输出的地方加上<%=toChinaTime %>就OK了。

2。第二种方法就是最简单的了:

直接用helper了。。。

def toChinaTime(time=Time.now)

       @timehelp = time.strftime("%Y年%m月%d日 @ " + (time.strftime("%p") == "AM" ? "上午" : "下 午" ) + " %H:%M")   

  end

页面上同上,加个<%=toChinaTime %>就OK了。

----------------------------------------附带个小知识------------------------------------

所有strftime方法中可用的格式化符号:

 =====================================================

 %a    星期的缩写,如Wed

 %A    星期的全称,如Wednesday

 %U    本星期在全年中所属的周数

 %W    

 %H    小时(24小时制)

 %M    分钟

 %S    秒

 %I    小时(12小时制)

 %p    PM 或 AM

 

 %b    月份的缩写,如 Jan

 %B    月份的全称,如 January

 %c    本地日期和时间,如 06/14/07 16:43:49

 %d    日期 (1..31)

 %j    本日在一年中所属的天 (1..366)

 %m    月份 (1..12)

 %w    星期的数字形式 (0..6)

 %x    本地日期,如 06/14/07

 %Y    本地时间,如 16:43:49

 %y    2位的年份表示,如07

 %Y    4位的年份表示,如2007

 %Z    时区名,如"中国标准时间"

 %%    字面符号%

------------------------------------------------------------------------------

1 Range#to_s(:db) 

代码

>> (7.days.ago..1.day.ago).to_s(:db)  

=> "BETWEEN '2006-12-11 02:06:50' AND '2006-12-17 02:06:50'"   

2 Time Calculations 

代码

>> Time.days_in_month(2)  

=> 28  

>> Time.now.seconds_since_midnight  

=> 8709.840965  

  

# last_year, next_year, last_month, next_month  

>> Time.now.last_year  

=> Sun Dec 18 02:25:59 -0800 2005  

>> Time.now.next_month  

=> Thu Jan 18 02:26:41 -0800 2007  

  

# beginning_of_day, end_of_day, beginning_of_month, end_of_month  

# beginning_of_quarter, beginning_of_year  

>> Time.now.beginning_of_day  

=> Mon Dec 18 00:00:00 -0800 2006  

  

# yesterday, tomorrow, next_week(day = :monday)  

>> Time.now.tomorrow  

=> Tue Dec 19 02:28:01 -0800 2006  

>> Time.now.next_week(:friday)  

=> Fri Dec 29 00:00:00 -0800 2006  

  

# valid symbol keys for #change:  

#   year, month, mday, hour, min, sec, usec  

>> Time.now  

=> Mon Dec 18 02:33:17 -0800 2006  

>> Time.now.change(:hour => 1)  

=> Mon Dec 18 01:00:00 -0800 2006  

  

>> Time.now.in(5.days)  

=> Sat Dec 23 02:34:59 -0800 2006  

3.blank? 

代码

>> 0.blank?  

=> false  

>> " ".blank?  

=> true  

>> [].blank?  

=> true  

>> {}.blank?  

=> true  

>> nil.blank?  

=> true    

4. returning 

代码

def create_book  

  book = Book.new  

  book.title = "Trafalgar: The Nelson Touch"  

  book.author = "David Howarth"  

  @db.add(book)  

  book  

end  

等同  

def create_book  

  returning Book.new do |book|  

    book.title = "Trafalgar: The Nelson Touch"  

    book.author = "David Howarth"  

    @db.add(book)  

  end  

end  

5.Time#to_s(:format) 

代码

>> Time.now.to_s(:time)  

=> "01:50"   

>> Time.now.to_s(:short)  

=> "Dec 18, 2006"   

>> Time.now.to_s(:db)  

=> "2006-12-18 01:50:42"   

>> time.to_s(:stamp)  

=> 5:23PM  

>> time.to_s(:relative)  

=> today   

©著作权归作者所有:来自51CTO博客作者blackanger的原创作品,如需转载,请注明出处,否则将追究法律责任

元编程eval中文格式化时间


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消