Ruby方法参数默认值的一个小技巧在Rails中的应用
我们需要生成一个gravatar格式的html.image标示,于是写了如下方法:
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.firstunless size.nil?//do some workend
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")elseimage_tag(gravatar_url, alt: user.name, class: "gravatar",size:size.to_s)endend
如果用户未指定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中的应用相关推荐
- java接口参数默认值_下面关于setMaxAge(int expires)方法参数默认值的描述中,正确的是(5.0分)_学小易找答案...
[单选题]下面选项中,用于在web.xml中配置监听器的元素是(5.0分) [填空题]Cookie技术用于将会话过程中的数据保存到( )中,从而使浏览器和服务器可以更好地进行数据交互.(5.0分) [ ...
- android 方法参数默认值,Kotlin函数默认值的完全讲解
函数默认值 周所周知,Java语言并不支持参数使用默认值.有人说这是因为"默认参数"和"方法重载"同时支持的话有二义性的问题,具体真正的原因我不得而知.但是对我 ...
- ES6函数参数的解构赋值,以及2种设置参数默认值方法的区别
文章目录 1. 函数参数的解构赋值方式 2. 函数参数解构设置参数默认值 1. 方法1 2. 方法2 3. 总结 1. 函数参数的解构赋值方式 下面代码中,函数add的参数表面上是一个数组,但在传入参 ...
- C++ 笔记(13)— 函数(函数声明、函数定义、函数调用[传值、指针、引用]、函数参数默认值、函数重载)
每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数. 1. 函数声明 函数声明告诉编译器函数的名称.返回类型和参数.函数声明包括以下几个部分: ret ...
- ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map
根据视频进行整理 [https://www.bilibili.com/video/BV1uK411H7on?p=1] 视频资源(百度网盘): 链接:[https://pan.baidu.com/s/1 ...
- JavaScript中实现函数重载和参数默认值
2019独角兽企业重金招聘Python工程师标准>>> 参数默认值是指在调用函数时,若省略了某个实参,函数会自动为该参数分配一个默认值,使得函数调用的方便性和灵活性大大提高. 举个例 ...
- ES6: 参数默认值及中间域
下午看了一章 ECMA-262 by Dmitry Soshnikov, 现在稍稍来小结下ES6中的参数默认值以及由此产生的参数中间作用域. 原文地址: http://dmitrysoshnikov. ...
- ES6:Rest 参数和参数默认值【转】
Rest 参数 通常,我们需要创建一个可变参数的函数,可变参数是指函数可以接受任意数量的参数.例如,String.prototype.concat 可以接受任何数量的字符串作为参数.使用 Rest 参 ...
- ES6新特性之函数优化-参数默认值
函数优化 在ES6中,对函数的操作做了优化,使得我们在操作函数时更加的便捷. 函数参数默认值 在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通写法: function add(a , b) ...
最新文章
- 给现有MVC项目增加Web API支持
- excel之根据单元格内容自动修改单元格颜色
- mongodb视频教程云盘,深度讲解Java多线程开发—电子表项目实现
- vue中使用keepAlive组件缓存遇到的坑
- 深入理解脚本化CSS系列第五篇——动态样式
- AIdl server端监听client是否掉线
- linux的目录创建时间,LINUX下文件创建时间问题
- 调教 游戏java_如何优雅的调教Java(eclipse篇)(三)安装插件的崩溃瞬间代号(2599)...
- HR图像添加运动焦散模糊【Matlab】
- POI给word中插入图片后打不开的bug
- 程序员要不要懂底层原理
- 计算机对舞蹈影响,计算机技术在舞蹈教学中的应用
- Python 数据分析 —— Matplotlib ②
- 如何将html模板资源转为vuecli项目
- 【统计学】Python计算并绘制样本数据的经验分布函数
- 坐标系、欧拉角、旋转矩阵、四元数
- 带你玩转kubernetes-k8s(第38篇:深入分析集群安全机制)
- 【跟学C++】C++类与对象—构造函数—析构函数(Study10)
- 用5分、2分、1分硬币组成一元钱,共有多少方式?
- PS:金色哥特艺术文字