当前位置: 首页 > news >正文

ruby简单的基础 5

方法和代码块



在Ruby中。{}或do...end之间的代码是一个代码块。
代码块只能出如今一个方法的后边,它紧接在方法最后一个參数的同一行上,一般由yieldkeyword调用代码块中的代码。




方法是一个有名的代码块。是与一个或者多个对象相关联的參数化代码。


调用方法时必需要给出方法名、所在对象(接受者),以及零个或者多个參数值,方法中最后一个表达式的值将作为方法调用的返回值。


代码块不是ruby可操作的对象。一般我们用一个Proc对象代表一个代码块。
有两种方式的Proc对象,一种是proc。一种是lambda,他们都是闭包:他们会保持定义时所在范围内的局部变量,即使在外部范围被调用时。他们也能够对这些变量进行訪问。


方法的定义就不说了。前面有说过。


方法名以小写字母开头。假设方法名超过一个字母,一般用下划线切割开来。


方法可选的圆括号

在很多方法调用中圆括号是可省略的,如 puts “hello” 和 puts (“hello”)是一样的。
ruby是一种强面向对象的语言。他的对象被全然封装。与他们交流的唯一方式就是调用他们的方法。所以 len = "hello".length 事实上是 len = “hello”.length(),只只是把圆括号省略掉了,你看起看好像是他的属性訪问。


普通情况下,假设參数超过一个,最好不要省略圆括号。


代码块參数

传统方式就是代码块直接跟在方法后面。并用yield来调用代码块。
在函数里面的有一条yield语句。到时候运行的时候能够运行函数外的block。并且这个block能够有自己的context, 感觉有点像callback,又有点像c里面的宏定义。


有人说yield就充当一个占位符的作用,函数先给一个占位符,这个函数如同一个纯需函数一样不能直接调用,必须用block把这个位坑给添了才干使用这个函数。  

def block_test(num)
	if block_given?
		#yield #无參数
		yield (num)
	else
		puts num
	end


end


#block_test(1)
#block_test(2) { puts "this is a block ..."}
block_test(2) {|x| puts x * 2}



或者在方法的后面加上一个參数,并用&作为这个參数的前缀,这样这个參数就会指向传给方法的代码块,这个參数的值是个Proc对象。它不是通过yield调用的,而是call调用的。
def proc_test(num,&b)


	if block_given?
	 	#b.call
		b.call(num * 3)
	else
		puts "no block"
	end


end


#proc_test(1) 
#proc_test(1) {puts "this is a block"}
proc_test(1) {|x| puts x * 2}


创建Proc对象的3种方式

Proc.new
假设在方法的最后一个形參前添加一个”&”符号,那么Ruby会把这个形參作为一个Proc对象处理。
全部的Proc对象都有一个call的方法,当调用这种方法时,会运行创建这个Proc对象时定义的代码块。
假设Proc.new不带參数。返回一个proc方式的Proc对象。

Proc对象有proc方式、lambda方式。


假设Proc.new带參数。返回一个关联代码块的Proc对象,这个对象代表这个关联的代码块。


p = Proc.new { puts "hello,dear..."}


def proc_test(&pp)
	pp.call
end




Kernel.lambda
lambda方法返回的是一个lambda方式的Proc对象。
lambda方法不带參数,可是在调用时必须关联一个代码块。


puts lambda{|x| x + 10}.call(2)



Kernel.proc
这个1.8是lambda的同义词,1.9是Proc.new的同义词。
这个就不说了。




代码块,proc。lambda的return
一个代码块中的return语句不仅会从调用代码块的迭代器中返回,还会从调用迭代器的的方法中返回。

def test
	puts "start.."
	2.times {puts "hello,";return}
	puts "end..." #不会别打印
end




proc和代码块相似,所以假设在调用的proc中运行一个return语句,它会试图从代码块所在的方法中返回。
而在lambda中的return语句只时从lambda自身返回。


def pro_fun (msg)
	puts "start..."


	p = Proc.new {puts "hello,#{msg}";return} #会从代码块所在的方法pro_fun中返回
	p.call


	puts "end..."
end


def lambda_fun(msg)
	puts "start.."
	lam = lambda {puts "hello,#{msg}";return} #只返回自身
	lam.call
	puts "end..."
end


def test
	puts "test start"
	#pro_fun "song"
	lambda_fun "song"
	puts "test end"
end


test



转载于:https://www.cnblogs.com/bhlsheji/p/5259871.html

相关文章:

  • 【Xamarin挖墙脚系列:打造独特的Xamarin.IOS开发环境】
  • 记考研高数第一课
  • C++ Primer Plus学习:第二章
  • Nmap扫描教程之DNS服务类
  • 怎样制作捐赠二维码,实现开源项目或免费应用的捐赠收款(支付宝篇)
  • 培训日报3.14(mysql,guava,穿山甲等)
  • 设计模式(三)工厂方法模式(Factory Pattern)
  • jQuery 增加 删除 修改select option
  • LINQ查收数据库的性能瓶颈
  • Stream groupings
  • 重构第4天:降低方法(Push Down Method)
  • [基础] 重载的时候什么时候用引用
  • 技术架构的关注点
  • 在线生成GIF文件
  • 给厕所换了一个排污管
  • [译] React v16.8: 含有Hooks的版本
  • Angular 4.x 动态创建组件
  • Druid 在有赞的实践
  • node学习系列之简单文件上传
  • PermissionScope Swift4 兼容问题
  • Promise面试题2实现异步串行执行
  • springMvc学习笔记(2)
  • 阿里云前端周刊 - 第 26 期
  • 产品三维模型在线预览
  • 大主子表关联的性能优化方法
  • 工作手记之html2canvas使用概述
  • 每天一个设计模式之命令模式
  • 前端之React实战:创建跨平台的项目架构
  • 前端自动化解决方案
  • 说说动画卡顿的解决方案
  • 算法-插入排序
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​2021半年盘点,不想你错过的重磅新书
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #Lua:Lua调用C++生成的DLL库
  • #vue3 实现前端下载excel文件模板功能
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)windows配置JDK环境
  • (附源码)php新闻发布平台 毕业设计 141646
  • (论文阅读40-45)图像描述1
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Linux整合apache和tomcat构建Web服务器
  • .Net 代码性能 - (1)
  • .net程序集学习心得
  • @Autowired 与@Resource的区别
  • @ConfigurationProperties注解对数据的自动封装