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)
代码
  1. >> (7.days.ago..1.day.ago).to_s(:db)
  2. => "BETWEEN '2006-12-11 02:06:50' AND '2006-12-17 02:06:50'"
2 Time Calculations
代码
  1. >> Time.days_in_month(2)
  2. => 28
  3. >> Time.now.seconds_since_midnight
  4. => 8709.840965
  5. # last_year, next_year, last_month, next_month
  6. >> Time.now.last_year
  7. => Sun Dec 18 02:25:59 -0800 2005
  8. >> Time.now.next_month
  9. => Thu Jan 18 02:26:41 -0800 2007
  10. # beginning_of_day, end_of_day, beginning_of_month, end_of_month
  11. # beginning_of_quarter, beginning_of_year
  12. >> Time.now.beginning_of_day
  13. => Mon Dec 18 00:00:00 -0800 2006
  14. # yesterday, tomorrow, next_week(day = :monday)
  15. >> Time.now.tomorrow
  16. => Tue Dec 19 02:28:01 -0800 2006
  17. >> Time.now.next_week(:friday)
  18. => Fri Dec 29 00:00:00 -0800 2006
  19. # valid symbol keys for #change:
  20. #   year, month, mday, hour, min, sec, usec
  21. >> Time.now
  22. => Mon Dec 18 02:33:17 -0800 2006
  23. >> Time.now.change(:hour => 1)
  24. => Mon Dec 18 01:00:00 -0800 2006
  25. >> Time.now.in(5.days)
  26. => Sat Dec 23 02:34:59 -0800 2006

3.blank?

代码
  1. >> 0.blank?
  2. => false
  3. >> " ".blank?
  4. => true
  5. >> [].blank?
  6. => true
  7. >> {}.blank?
  8. => true
  9. >> nil.blank?
  10. => true

4. returning

代码
  1. def create_book
  2. book = Book.new
  3. book.title = "Trafalgar: The Nelson Touch"
  4. book.author = "David Howarth"
  5. @db.add(book)
  6. book
  7. end
  8. 等同
  9. def create_book
  10. returning Book.new do |book|
  11. book.title = "Trafalgar: The Nelson Touch"
  12. book.author = "David Howarth"
  13. @db.add(book)
  14. end
  15. end

5.Time#to_s(:format)

代码
  1. >> Time.now.to_s(:time)
  2. => "01:50"
  3. >> Time.now.to_s(:short)
  4. => "Dec 18, 2006"
  5. >> Time.now.to_s(:db)
  6. => "2006-12-18 01:50:42"
  7. >> time.to_s(:stamp)
  8. => 5:23PM
  9. >> time.to_s(:relative)
  10. => today

Ruby一些小case总结相关推荐

  1. R语者小case之——从KEGG原始网页批量生成通路的基因表格

    我们经常要用到KEGG数据库来对基因做功能分析.经常长得好看的朋友问:如何获得整个通路的基因? 其实我们有多种方法可以获得通路中所有的基因情况,本文通过KEGG的原始网页生成某个通路的基因表格. 准备 ...

  2. 我的上司叫“专横”,驾驭他小case,情商修炼术

    我的上司叫"专横",驾驭他小case,情商修炼术 特征: 人如其"名"--趾高气扬.蔑视态度会让人感到害怕 不如意的地方: 讨厌出人意料的事.当他对所见所闻毫无 ...

  3. 小case:轻松解决企业建站的五大基础问题

    小case:轻松解决企业建站的五大基础问题 一说到网站建设,不难发现,大家都已经毫不担忧了,的确,现在的建站技术越来越高超,很多站长省了不少麻烦,建完网站也花不了多长时间.可是,对于新手来说,还存在着 ...

  4. 一篇文章从0搞定计算机网络,面试小case

    文章目录 [关于作者] 1.网络分层 1.1.OSI7层模型 1.2.TCP/IP四层模型 1.3.数据包的封装与分用 1.4.协议簇 2.物理层 3.数据链路层 3.1.数据帧格式 3.2.ARP ...

  5. android曲面屏触摸事件,Android屏幕适配完美解决方案(曲面屏手机也是小Case)

    纸上得来终觉浅 绝知此事要躬行. 安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念.dp转px.只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏 ...

  6. Mysql - 从一个小 case 理解 MVCC

    从 innoDB 的一致性非锁定读说起 非锁定读和行快照数据 一致性的非锁定读(consistent nonlocking read)是指 InnoDB 存储引擎通过行多版本控制(multi vers ...

  7. 打造次世代分析型数据库(四):几十张表关联?小Case!

    作者介绍 qiannzhang(张倩),腾讯云数据库专家工程师,具备多年数据库内核研发经验,在大数据分析领域深耕多年.加入腾讯后,主要负责CDW PG数据库SQL引擎相关特性的研发工作. 背景介绍 C ...

  8. R语者小case之——巧用table函数做多变量分类统计

    表中记录了两家医院在多年间分娩的产妇使用某种药物的信息. 要求计算出使用药物的产妇的比例,绘制成如下的图. library("readxl") library("ggpl ...

  9. python操作windows窗口一个小case

    1. import win32gui, win32con 2. win32gui.FindWindow找到目标程序: win = win32gui.FindWindow(None, u'无标题 - 记 ...

最新文章

  1. Python numpy 提取矩阵的某一行或某一列
  2. 四个好用却可能不为人所熟知的Pandas函数,建议收藏!!!
  3. php ajax成功失败,php – 让$.ajax失败
  4. container常见操作
  5. (Docker实战) 第5篇:Centos7 拉取和部署搭建 NEXUS私服
  6. 4. Spring Boot 过滤器、监听器
  7. android tv的冷启动,YunOS智能电视操作系统——10秒快速冷启动开机
  8. cp abe java_CP-ABE环境配置
  9. 如何将公式插入到word
  10. 使用这6个技巧来物理保护 MacBook
  11. 阿里专家与你分享:你必须了解的Java多线程技术
  12. 淘宝、天猫评论如何抓取?
  13. Go语言使用protobuf快速入门
  14. 何谓赛道思维?隔壁阿三加密货币赛道重启,我们何时迎头赶上?
  15. Google Chrome自定义新标签页
  16. nginx反向代理是什么?
  17. html mysql留言板_html留言板
  18. 【IT文化杂谈】硅谷,仙童与“八叛徒”的故事
  19. 【CVPR 2021】Knowledge Review:知识蒸馏新解法
  20. ti dra712多处理器芯片

热门文章

  1. 关于事件监听机制的总结(Listener和Adapter)
  2. linux 第十五章 shell 脚本习题
  3. 先搞清楚了任务究竟是什么再说
  4. CSLA.Net 3.0.5 项目管理示例 名值列表基类、只读基类、业务负责人基类
  5. iBATIS:xml中定义返回值
  6. 工业物联网将借助新兴技术实现华丽转身
  7. squid代理(传统代理)
  8. elasticsearch的集中常见操作
  9. linux的运维管理UNIT3
  10. 情境感知技术是什么?