Ruby方法参数默认值的一个小技巧在Rails中的应用
2017-01-15 09:39
441 查看
我们需要生成一个gravatar格式的html.image标示,于是写了如下方法:
但是现在我们需要在生成image标示时可以定制图片大小,这里有几种方法,首先是用可选参数:
第二种是参数默认值:
但这里有一个问题,如果调用时未给size输入值,我们不希望使用40,而是gravatar_far逻辑不变.这里的关键是如何判断用户是否给size输入了值,我们不能仅仅 if size == 40,因为用户可能以40调用size.因为ruby的”最后表达式定值”的特性,我们可以这样写:
如果用户未指定size默认值,那么flag一定为nil,否则为true.
最后一种方式是使用hash,你大概不希望调用 gravatar_tag(user,120)时搞不清120表示的是神马!?所以你希望像swift语言那样带参数名称去调用,不过这里用hash来模拟也是绰绰有余了:
现在你可以这样调用了:
PS:ruby 2.x的命名参数特性我特地新开一篇blog介绍,请猛戳以下链接:
Ruby 2.x 命名参数特性简介
def gravatar_for(user) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" image_tag(gravatar_url, alt: user.name, class: "gravatar") end
但是现在我们需要在生成image标示时可以定制图片大小,这里有几种方法,首先是用可选参数:
def gravatar_for(user,*args) size = args.first unless size.nil? //do some work end end
第二种是参数默认值:
def gravatar_for(user,size=40) end
但这里有一个问题,如果调用时未给size输入值,我们不希望使用40,而是gravatar_far逻辑不变.这里的关键是如何判断用户是否给size输入了值,我们不能仅仅 if size == 40,因为用户可能以40调用size.因为ruby的”最后表达式定值”的特性,我们可以这样写:
def gravatar_for(user,size=(flag=true,40)) gravatar_id = Digest::MD5::hexdigest(user.email.downcase) gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}" unless flag.nil? image_tag(gravatar_url, alt: user.name, class: "gravatar") else image_tag(gravatar_url, alt: user.name, class: "gravatar",size:size.to_s) end end
如果用户未指定size默认值,那么flag一定为nil,否则为true.
最后一种方式是使用hash,你大概不希望调用 gravatar_tag(user,120)时搞不清120表示的是神马!?所以你希望像swift语言那样带参数名称去调用,不过这里用hash来模拟也是绰绰有余了:
def gravatar_for(user,hash) size = hash[:size] //do some work... end
现在你可以这样调用了:
gravatar_for(user,size:100)
PS:ruby 2.x的命名参数特性我特地新开一篇blog介绍,请猛戳以下链接:
Ruby 2.x 命名参数特性简介
相关文章推荐
- Ruby方法参数默认值的一个小技巧在Rails中的应用
- Ruby方法参数默认值的一个小技巧在Rails中的应用
- thinking in Ruby and Rails: rails的params参数原来是个方法
- Ruby On Rails 一个提交键传递不同参数到两个post函数
- Ruby on Rails,一个简单的CMS系统,创建应用骨架并与数据库连接
- url参数转换为ruby对象时,rails框架使用的方法
- Ruby on Rails,一个简单的CMS系统,创建应用骨架并与数据库连接
- Ruby on Rails本地安装方法
- Ruby on Rails之Oracle应用(1)
- SuseLInux下安装Ruby 及 Rails遇到的问题及解决方法
- 一个通过反射改变request的请求参数的方法
- Ruby on Rails本地安装方法
- Access 至少一个参数没有被指定值 解决方法
- Net反射技术应用解决对象不同版本方法不同参数的问题(转)
- 小技巧:C++限制一个方法只能在某个类当中被调用
- SQL中函数返回表,传递一个参数,无法唤醒用户自定义函数,解决方法!
- Thin的DateChooser代码学习(关于js的函数参数为一个完整的函数以及“对象不支持此属性或方法”错误的解决)(原创,转载请声明)
- 同一个WEB服务器中两个应用中的目录共享方法
- PL/SQL小技巧一个:在子类中怎么调用父类被重载的方法
- Net反射技术应用解决对象不同版本方法不同参数的问题