您的位置:首页 > 编程语言 > Ruby

Ruby一些小case总结 推荐

2007-08-09 12:50 387 查看
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,对于已经执行过的代码解释器会有记录而不会重新解释。
具体源码可以去看:
http://ruby-lang.org.cn/forums/viewthread.php?tid=714&extra=page%3D1

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息