Ruby一些小case总结
Ruby中文社区有个小问题:
==================================
比较下面两段代码:
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 时区名,如"中国标准时间"
%% 字面符号%
------------------------------------------------------------------------------
- >> (7.days.ago..1.day.ago).to_s(:db)
- => "BETWEEN '2006-12-11 02:06:50' AND '2006-12-17 02:06:50'"
- >> 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
Ruby一些小case总结相关推荐
- R语者小case之——从KEGG原始网页批量生成通路的基因表格
我们经常要用到KEGG数据库来对基因做功能分析.经常长得好看的朋友问:如何获得整个通路的基因? 其实我们有多种方法可以获得通路中所有的基因情况,本文通过KEGG的原始网页生成某个通路的基因表格. 准备 ...
- 我的上司叫“专横”,驾驭他小case,情商修炼术
我的上司叫"专横",驾驭他小case,情商修炼术 特征: 人如其"名"--趾高气扬.蔑视态度会让人感到害怕 不如意的地方: 讨厌出人意料的事.当他对所见所闻毫无 ...
- 小case:轻松解决企业建站的五大基础问题
小case:轻松解决企业建站的五大基础问题 一说到网站建设,不难发现,大家都已经毫不担忧了,的确,现在的建站技术越来越高超,很多站长省了不少麻烦,建完网站也花不了多长时间.可是,对于新手来说,还存在着 ...
- 一篇文章从0搞定计算机网络,面试小case
文章目录 [关于作者] 1.网络分层 1.1.OSI7层模型 1.2.TCP/IP四层模型 1.3.数据包的封装与分用 1.4.协议簇 2.物理层 3.数据链路层 3.1.数据帧格式 3.2.ARP ...
- android曲面屏触摸事件,Android屏幕适配完美解决方案(曲面屏手机也是小Case)
纸上得来终觉浅 绝知此事要躬行. 安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念.dp转px.只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏 ...
- Mysql - 从一个小 case 理解 MVCC
从 innoDB 的一致性非锁定读说起 非锁定读和行快照数据 一致性的非锁定读(consistent nonlocking read)是指 InnoDB 存储引擎通过行多版本控制(multi vers ...
- 打造次世代分析型数据库(四):几十张表关联?小Case!
作者介绍 qiannzhang(张倩),腾讯云数据库专家工程师,具备多年数据库内核研发经验,在大数据分析领域深耕多年.加入腾讯后,主要负责CDW PG数据库SQL引擎相关特性的研发工作. 背景介绍 C ...
- R语者小case之——巧用table函数做多变量分类统计
表中记录了两家医院在多年间分娩的产妇使用某种药物的信息. 要求计算出使用药物的产妇的比例,绘制成如下的图. library("readxl") library("ggpl ...
- python操作windows窗口一个小case
1. import win32gui, win32con 2. win32gui.FindWindow找到目标程序: win = win32gui.FindWindow(None, u'无标题 - 记 ...
最新文章
- Python numpy 提取矩阵的某一行或某一列
- 四个好用却可能不为人所熟知的Pandas函数,建议收藏!!!
- php ajax成功失败,php – 让$.ajax失败
- container常见操作
- (Docker实战) 第5篇:Centos7 拉取和部署搭建 NEXUS私服
- 4. Spring Boot 过滤器、监听器
- android tv的冷启动,YunOS智能电视操作系统——10秒快速冷启动开机
- cp abe java_CP-ABE环境配置
- 如何将公式插入到word
- 使用这6个技巧来物理保护 MacBook
- 阿里专家与你分享:你必须了解的Java多线程技术
- 淘宝、天猫评论如何抓取?
- Go语言使用protobuf快速入门
- 何谓赛道思维?隔壁阿三加密货币赛道重启,我们何时迎头赶上?
- Google Chrome自定义新标签页
- nginx反向代理是什么?
- html mysql留言板_html留言板
- 【IT文化杂谈】硅谷,仙童与“八叛徒”的故事
- 【CVPR 2021】Knowledge Review:知识蒸馏新解法
- ti dra712多处理器芯片