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中文格式化时间