- 浏览: 2078986 次
- 性别:
- 来自: NYC
文章分类
- 全部博客 (628)
- Linux (53)
- RubyOnRails (294)
- HTML (8)
- 手册指南 (5)
- Mysql (14)
- PHP (3)
- Rails 汇总 (13)
- 读书 (22)
- plugin 插件介绍与应用 (12)
- Flex (2)
- Ruby技巧 (7)
- Gem包介绍 (1)
- javascript Jquery ext prototype (21)
- IT生活 (6)
- 小工具 (4)
- PHP 部署 drupal (1)
- javascript Jquery sort plugin 插件 (2)
- iphone siri ios (1)
- Ruby On Rails (106)
- 编程概念 (1)
- Unit Test (4)
- Ruby 1.9 (24)
- rake (1)
- Postgresql (6)
- ruby (5)
- respond_to? (1)
- method_missing (1)
- git (8)
- Rspec (1)
- ios (1)
- jquery (1)
- Sinatra (1)
最新评论
-
dadadada2x:
user模型里加上 protected def email ...
流行的权限管理 gem devise的定制 -
Sev7en_jun:
shrekting 写道var pattern = /^(0| ...
强悍的ip格式 正则表达式验证 -
jiasanshou:
好文章!!!
RPM包rpmbuild SPEC文件深度说明 -
寻得乐中乐:
link_to其实就是个a标签,使用css控制,添加一个参数: ...
Rails在link_to中加参数 -
aiafei0001:
完全看不懂,不知所然.能表达清楚一点?
"$ is not defined" 的问题怎么办
method_missing经常用来写Ruby的元编程。例如,如果你的UserModel有个email的属性,你就可以通过
respond_to?在实现动态编程中也经常会用到,通常我们在使用respond之前判断是否有respond。
那么我们具体看看实现:
假设我们有Legislator类,我们将实现从find_by_first_name('John') 到find(:first_name => 'John')的动态逻辑
如下:
按照道理来说,这是通过样的逻辑,只是Legislator.respond_to?(:find_by_first_name)会返回false那么我们需要respond_to?来支持。
那么现在有一个问题,就是我们的重复了。这就很不DRY。所以,我们可以和ActiveRecord的学习,看看是怎么处理重复的问题的。实际上ActiveRecord把逻辑封装在了ActiveRecord::DynamicFinderMatch以便不会在method_missing 和respond_to?重复代码
method_missing的缓冲
显然method missing效率不好,那么太多的method missing一定导致很慢。所以另外一个我们可以学习ActiveRecord的地方是我们可以在定义method missing的同时发送到正定义的方法,如下:
测试
创建LegislatorDynamicFinderMatch来测试逻辑,下面是RSpec的例子:
当然,如果你的动态实习需要一些输入的话,很难免你需要用到RSpec,如下:
总之,如果你正在写动态方法你应该考虑respond_to?
User.find_by_email('joe@example.com')来查找,这是如果User并没有定义这个方法,那么ActiveRecord::Base就会处理这样的请求。后面我们会具体分析这过程的逻辑和实现,并学习处理。
respond_to?在实现动态编程中也经常会用到,通常我们在使用respond之前判断是否有respond。
那么我们具体看看实现:
假设我们有Legislator类,我们将实现从find_by_first_name('John') 到find(:first_name => 'John')的动态逻辑
如下:
class Legislator # Pretend this is a real implementation def find(conditions = {}) end # Define on self, since it's a class method def self.method_missing(method_sym, *arguments, &block) # the first argument is a Symbol, so you need to_s it if you want to pattern match if method_sym.to_s =~ /^find_by_(.*)$/ find($1.to_sym => arguments.first) else super end end end
按照道理来说,这是通过样的逻辑,只是Legislator.respond_to?(:find_by_first_name)会返回false那么我们需要respond_to?来支持。
class Legislator # ommitted # It's important to know Object defines respond_to to take two parameters: the method to check, and whether to include private methods # http://www.ruby-doc.org/core/classes/Object.html#M000333 def self.respond_to?(method_sym, include_private = false) if method_sym.to_s =~ /^find_by_(.*)$/ true else super end end end
那么现在有一个问题,就是我们的重复了。这就很不DRY。所以,我们可以和ActiveRecord的学习,看看是怎么处理重复的问题的。实际上ActiveRecord把逻辑封装在了ActiveRecord::DynamicFinderMatch以便不会在method_missing 和respond_to?重复代码
class LegislatorDynamicFinderMatch attr_accessor :attribute def initialize(method_sym) if method_sym.to_s =~ /^find_by_(.*)$/ @attribute = $1.to_sym end end def match? @attribute != nil end end class Legislator def self.method_missing(method_sym, *arguments, &block) match = LegislatorDynamicFinderMatch.new(method_sym) if match.match? find(match.attribute => arguments.first) else super end end def self.respond_to?(method_sym, include_private = false) if LegislatorDynamicFinderMatch.new(method_sym).match? true else super end end end
method_missing的缓冲
显然method missing效率不好,那么太多的method missing一定导致很慢。所以另外一个我们可以学习ActiveRecord的地方是我们可以在定义method missing的同时发送到正定义的方法,如下:
class Legislator def self.method_missing(method_sym, *arguments, &block) match = LegislatorDynamicFinderMatch.new(method_sym) if match.match? define_dynamic_finder(method_sym, match.attribute) send(method_sym, arguments.first) else super end end protected def self.define_dynamic_finder(finder, attribute) class_eval <<-RUBY def self.#{finder}(#{attribute}) # def self.find_by_first_name(first_name) find(:#{attribute} => #{attribute}) # find(:first_name => first_name) end # end RUBY end end
测试
创建LegislatorDynamicFinderMatch来测试逻辑,下面是RSpec的例子:
describe LegislatorDynamicFinderMatch do describe 'find_by_first_name' do before do @match = LegislatorDynamicFinderMatch.new(:find_by_first_name) end it 'should have attribute :first_name' do @match.attribute.should == :first_name end it 'should be a match' do @match.should be_a_match end end describe 'zomg' do before do @match = LegislatorDynamicFinderMatch(:zomg) end it 'should have nil attribute' do @match.attribute.should be_nil end it 'should not be a match' do @match.should_not be_a_match end end end
当然,如果你的动态实习需要一些输入的话,很难免你需要用到RSpec,如下:
describe Legislator, 'dynamic find_by_first_name' do it 'should call find(:first_name => first_name)' do Legislator.should_receive(:find).with(:first_name => 'John') Legislator.find_by_first_name('John') end end
总之,如果你正在写动态方法你应该考虑respond_to?
发表评论
-
Destroying a Postgres DB on Heroku
2013-04-24 10:58 939heroku pg:reset DATABASE -
VIM ctags setup ack
2012-04-17 22:13 3261reference ctags --extra=+f --e ... -
alias_method_chain方法在3.1以后的替代使用方式
2012-02-04 02:14 3302alias_method_chain() 是rails里的一个 ... -
一些快速解决的问题
2012-01-19 12:35 1476问题如下: 引用Could not open library ... -
API service 安全问题
2011-12-04 08:47 1388这是一个长期关注的课题 rest api Service的 ... -
Module方法调用好不好
2011-11-20 01:58 1354以前说,用module给class加singleton方法,和 ... -
一个ajax和rails交互的例子
2011-11-19 01:53 1911首先,这里用了一个,query信息解析的包,如下 https: ... -
Rails 返回hash给javascript
2011-11-19 01:43 2280这是一个特别的,不太正统的需求, 因为,大部分时候,ajax的 ... -
关于Rubymine
2011-11-18 23:21 2270开个帖子收集有关使用上的问题 前一段时间,看到半价就买了。想 ... -
ruby中和javascript中,动态方法的创建
2011-11-18 21:01 1246class Klass def hello(*args) ... -
textmate快捷键 汇总
2011-11-16 07:20 8153TextMate 列编辑模式 按住 Alt 键,用鼠标选择要 ... -
Ruby面试系列六,面试继续面试
2011-11-15 05:55 2031刚才受到打击了,充分报漏了自己基础不扎实,不肯向虎炮等兄弟学习 ... -
说说sharding
2011-11-13 00:53 1502这个东西一面试就有人 ... -
rails面试碎碎念
2011-11-12 23:51 1950面试继续面试 又有问ru ... -
最通常的git push reject 和non-fast forward是因为
2011-11-12 23:29 17228git push To git@github.com:use ... -
Rails 自身的many to many关系 self has_many
2011-11-12 01:43 2741简单点的 #注意外键在person上people: id ... -
Rails 3下的 in place editor edit in place
2011-11-12 01:20 951第一个版本 http://code.google.com/p ... -
Heroku 的诡异问题集合
2011-11-11 07:22 1700开个Post记录,在用heroku过程中的一些诡异问题和要注意 ... -
SCSS 和 SASS 和 HAML 和CoffeeScript
2011-11-07 07:52 12965Asset Pipeline 提供了内建 ... -
Invalid gemspec because of the date format in specification
2011-11-07 02:14 2128又是这个date format的错误。 上次出错忘了,记录下 ...
相关推荐
风光储微网并网仿真模型的构建与实践:永磁风机、光伏阵列与储能系统的协同控制策略及并网性能研究,风光储微网并网仿真模型 包含永磁风机发电机、光伏阵列、储能系统及其各自控制系统。 永磁直驱风机:机侧变流器采用转速外环电流内环的双闭环控制策略,爬山搜索法实现最大功率点跟踪控制。 光伏阵列后接boost升压至直流母线400V 采用扰动观察法实现mppt功能 储能电池采用buck-boost双向DCDC变器 控制策略采用电压外环电流内环双闭环控制 稳定直流母线电压400V恒定,电压纹波<1% 逆变并网采用单极调制,开关损耗大幅降低 逆变器采用电网电压前馈、电流环、锁相环控制,对于电网中含有的三次谐波有明显的抗干扰效果。 并网电流THD低至1.36%,满足并网要求 附带参考资料、建模过程参考文件夹(万字以上),含参数计算,亦有本人笔记 ,风光储微网并网仿真模型; 永磁风机发电机; 光伏阵列; 储能系统; 控制系统; 最大功率点跟踪控制; 双闭环控制策略; 直流母线电压稳定; 逆变并网; 抗干扰效果; 并网电流THD。,基于风光储微网的并网仿真模型:含永磁风机、光伏阵列及储能系统的双闭环控制策略研究
Simpack CRH2型高铁车辆模型:全轨道谱激励下的精细化模拟分析,simpack CRH2型高铁车辆模型,带全部轨道谱激励。 ,simpack; CRH2型高铁车辆模型; 轨道谱激励,"Simpack CRH2型高铁车辆模型:全轨道谱激励集成版"
c语言学生信息系统.zip
mongoose web
COMSOL辐射制冷模型:探索混凝土表面在晴朗天空下的温度分布与辐射冷却特性(不含对流),comsol辐射制冷模型 在晴朗的天空中,大气对于 8 到 13 μm(大气窗)范围内的波长几乎是透明的,因此即使在晴天,也有可能冷却表面。 该模型比较了混凝土块的上表面为黑色表面且具有辐射冷却属性时,该表面接触环境和太阳辐射的温度分布, 其中不包含对流冷却。 该模型将“固体传热”接口与“表面对表面辐射”接口相耦合,其中采用 4 个光谱带对辐射、表面发射率和天空辐射率的波长相关性进行建模。 ,关键词:comsol;辐射制冷模型;大气窗;波长;混凝土块;温度分布;辐射冷却属性;对流冷却;固体传热;表面对表面辐射;光谱带;辐射相关性。,基于comsol的辐射制冷模型:透明大气下混凝土块辐射传热分析
c语言商品销售系统源码.zip
二阶系统模糊PID控制策略仿真效果展示:动态响应与优化调整,二阶系统模糊PID控制 仿真效果如图所示 ,二阶系统; 模糊PID控制; 仿真效果,"二阶系统模糊PID控制:仿真效果图解展示"
com.iqiyi.i18n(1).apk
数据来源:主要来源于中国统计年鉴、城市统计年鉴、各地区统计年鉴、农业、工业行业、纺织行业、房地产业、能源行业、石油和化学行业、运输和储存业等重点行业数据采集与整理 数据范围:全国各地机场、航线、航司飞常准航班统计数据 数据期间:(详见文件名标识的年度区间) 主要指标: 各国往返内地航班的(总计划或总执行或总取消航班量 或总取消率,具体要看文件名标识): 韩国(KR) 日本(JP) 泰国(TH) 新加坡(SG) 越南(VN) 马来西亚(MY) 澳大利亚(AU) 俄罗斯(RU) 菲律宾(PH) 印尼(ID) 柬埔寨(KH) 阿联酋(AE) 英国(GB) 德国(DE) 美国(US) 意大利(IT) 新西兰(NZ) 法国(FR) 土耳其(TR) 哈萨克斯坦(KZ) 老挝(LA) 荷兰(NL) 缅甸(MM) 卡塔尔(QA) 尼泊尔(NP) 巴基斯坦(PK) 蒙古(MN) 孟加拉(BD) 埃塞俄比亚(ET) 埃及(EG) 西班牙(ES) 伊朗(IR) 比利时(BE) 沙特阿拉伯(SA) 马尔代夫(MV) 肯尼亚(KE) 土库曼斯坦(TM) 乌兹别克斯坦(UZ) 斯里兰卡(LK) 以色列(IL) 波兰(PL) 瑞士(CH) 葡萄牙(PT) 瑞典(SE) 芬兰(FI) 吉尔吉斯斯坦(KG) 文莱(BN) 匈牙利(HU) 坦桑尼亚联合共和国(TZ) 加拿大(CA) 阿尔及利亚(DZ) 奥地利(AT) 丹麦(DK) 塞尔维亚共和国(RS) 乌克兰(UA) 乌干达(UG) 也门共和国(YE) 伊拉克(IQ) 保加利亚(BG) 克罗地亚(HR) 关岛(GU) 冰岛(IS) 几内亚(GN) 刚果(CG) 刚果民主共和国(CD) 加蓬(GA) 北马里亚纳群岛(MP) 南苏丹(SS) 南非(ZA) 博茨瓦纳(BW) 卢旺达(RW) 卢森堡(LU) 印度(IN) 叙利亚(SY) 古巴(CU) 吉布提(DJ) 哥伦比亚(CO) 哥斯达黎加(CR) 喀麦隆(CM) 塔吉克斯坦(TJ) 塞拉利昂(SL) 墨西哥(MX) 尼日利亚(NG) 尼日尔(NE) 巴布亚新几内亚(PG) 巴拿马(PA) 巴西(BR) 希腊(GR) 拉脱维亚(LV) 挪威(NO) 捷克共和国(CZ) 摩洛哥(MA) 斯洛伐克(SK) 朝鲜(KP) 格鲁吉亚(GE) 毛里塔尼亚(MR) 毛里求斯(MU) 津巴布韦(ZW) 爱尔兰(IE) 瓦努阿图(VU) 留尼汪(RE) 白俄罗斯(BY) 科威特(KW) 突尼斯(TN) 约旦(JO) 罗马尼亚(RO) 苏丹(SD) 莫桑比克(MZ) 萨摩亚(WS) 赞比亚(ZM) 赤道几内亚(GQ) 阿塞拜疆(AZ) 阿富汗(AF) 阿曼(OM) 阿根廷(AR) 马拉维(MW) 马达加斯加(MG) 马里(ML) 黎巴嫩(LB) 圭亚那(GY) 斐济(FJ) 新喀里多尼亚(NC)
typecho文章免登陆付费阅读插件付费阅读自媒体插件源码。 一、插件简介 一个可以让Typecho站长使用付费阅读功能的插件,支持免登录付费,并且包含前台用户中心、积分商城功能,适合各个自媒体用户使用的WeMediaForTypecho自媒体付费阅读插件。 二、特别注意 用户中心和积分商城未测试仅供参考,并且该页面浏览器兼容及极速模式兼容较差,插件主要提供阅读付费功能,请知悉。 三、版本推荐 php5.6以上+MySql 四、使用方法 1、首先当然是将插件文件夹以WeMedia为名放到/usr/plugins/目录下,再到typecho后台启用; 2、再点击设置配置插件各项参数; 3、然后在你的原创文章之中点击编辑器里的“¥付费阅读”按钮,插入付费阅读标签,中间内容即为收费内容
基于双路神经网络和多输入时频图像算法的滚动轴承故障诊断研究——涵盖振动信号与多种时频算法的数据集实践(支持小波变换、短时傅里叶变换等),基于双路神经网络的滚动轴承故障诊断 融合了原始振动信号 和 二维信号时频图像 的多输入(多通道)故障诊断方法 单路和双路都可 时频图像算法可选小波变,短时傅里叶变,马尔可夫变迁场,格拉姆角场等 数据集可选凯斯西储大学,东南大学,江南大学等等 Pytorch和Tensorflow框架做的。 ,关键词:双路神经网络;滚动轴承故障诊断;多输入故障诊断方法;原始振动信号;二维信号时频图像;小波变换;短时傅里叶变换;马尔可夫变迁场;格拉姆角场;Pytorch框架;TensorFlow框架;凯斯西储大学数据集;东南大学数据集;江南大学数据集。,基于双路神经网络的滚动轴承故障诊断:多输入时频图像融合诊断方法研究与应用
指针初阶的基础知识
sina-weibo-crawler-master.zip
qdjango-db简单包装
基于MPC的P2构型混合动力汽车能量管理策略研究与应用,基于MPC的混合动力汽车能量管理策略 整车构型为P2构型的混合动力汽车 ,核心关键词:MPC(模型预测控制); 混合动力汽车; 能量管理策略; P2构型整车构型; 汽车能量管理。,基于MPC的P2构型混合动力汽车能量管理策略优化
MMC储能技术揭秘:模块化多电平变换器与正负序解耦控制的不平衡电网谐波补偿策略,MMC储能,mmc,模块化多电平变器储能,储能变器,多电平储能,soc均衡控制,两级式mmc,正负序解耦控制,正负序分离,不平衡控制,不平衡电网,谐波补偿,载波移相调制 ,核心关键词:MMC储能; 模块化多电平变换器储能; 储能变换器; 多电平储能; SOC均衡控制; 两级式MMC; 正负序解耦控制; 不平衡控制; 不平衡电网; 谐波补偿; 载波移相调制。,《MMC储能系统:多电平SOC均衡控制与不平衡电网谐波补偿研究》
基于组态王与西门子S7-200 PLC的六层电梯控制设计:图纸、IO分配与源代码全解析,西门子S7-200PLC和组态王的6层电梯六层电梯控制组态设计PLC设计 基于组态王和S7-200 PLC的六层电梯6层电梯控制 基于组态王和S7-200 PLC的六层电梯8层电梯控制 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面 组态王动画仿真,带PLC源代码,plc程序每一条都带着解释,组态王源代码,图纸,IO地址分配 ,西门子S7-200PLC; 组态王; 电梯控制; 6层/8层电梯; PLC设计; 梯形图程序; 接线图原理图; IO分配; 组态画面动画仿真; PLC源代码; 组态王源代码; 图纸。,基于S7-200 PLC与组态王的六层电梯控制系统设计与实现
基于web的老年活动中心管理系统的设计与实现(论文+源码)_kaic.zip
"基于LCL滤波器的单相逆变器并网控制电路仿真研究:dq坐标系网侧电流闭环控制的实现与验证",单相逆变器并网控制电路仿真。 网侧采用LCL滤波器。 基于dq坐标系的网侧电流闭环控制。 仿真中在0.3秒和0.6秒出更改了网侧电流给定值,以验证闭环控制效果,可实现较好地跟随,且网侧电压维持220ac不变。 运行环境为matlab simulink plecs等 ,单相逆变器; LCL滤波器; dq坐标系电流闭环控制; 网侧电流给定值调整; 电压稳定; MATLAB Simulink PLECS仿真。,"单相逆变器LCL滤波的网侧电流闭环控制仿真研究"
基于FPGA开发板的自适应滤波器设计,融合FIR、IIR滤波器与LMS、NLMS、RLS算法及FxLMS分数阶技术,基于FPGA的自适应滤波器FIR IIR滤波器LMS NLMS RLS算法 FxLMS 分数阶 本设计是在FPGA开发板上实现一个自适应滤波器,只需要输入于扰信号和期望信号(混合信号)即可得到滤波输出,使用非常简单。 ,关键词:FPGA; 自适应滤波器; FIR IIR滤波器; LMS NLMS RLS算法; FxLMS算法; 分数阶。,"FPGA自适应滤波器:基于分数阶的FIR与IIR滤波器实现LMS、NLMS及RLS算法"