Ruby语言误区总结-入门级教程(一)

持续更新ing...



1、字符串不能跟数字相加:


/* PHP */

$i = 1;
echo "Value is " + $i
 

上面是PHP中,字符串和数字相加,这完全没有问题,但是如果再Ruby下呢:

 
i=1
puts "Value is " + i

#TypeError: can't convert Fixnum into String
#	from (irb):2:in `+'
#	from (irb):2
 

可以看到,发生了错误。这也说明,Ruby跟其他动态语言还是有区别的,从PHP转到Ruby阵营的要小心啦。

但这些还是有简单的解决办法:

用to_s就可以转换成同类型

 
var1 = 2
var2 = '5'

puts var1.to_s + var2 # 25
puts var1 + var2.to_i # 7

puts 9.to_f / 2 # 4.5
 

 


2、“凡物皆对象”:

这一点可能对于接触过Ruby的人都知道,但是没有几个人能够真正参悟,例如:

PHPstrlen("test")用法,在Ruby中是"test".length

这一点,你注意到了没?

 

3、Symbol 唯一且不会变动的识别符号

在Hash中,经常会有:XXX这种识别符,比如:

config = { :foo => 123, :bar => 456 }
puts config[:foo] # 輸出 123

使用Symbol的理由是可以獲得執行上的效率,相同名稱的Symbol不會再重複建構物件,範例如下:

"foobar".object_id # 2151854740
"foobar".object_id # 2151830100
:foobar.object_id # 577768
:foobar.object_id # 577768

object_id方法會回傳Ruby內部的記憶體配置編號,你會發現相同內容的字串,也會是不同的新物件,但是Symbol不會。這種特性讓Symbol的主要用途是當做Hash的鍵。

 

4. If置于行末??!!

 

是的,在Ruby语言当中,如果if之后要执行的语句只有一句的话,我们可以将执行语句前置,比如:

puts "greater than ten" if total > 10

 

 

5、真假易辨:

只需记住一点,Ruby中,除了false, nil这两个,其他全部都值真的。真的?真的!

 

6、方法的各种省略:

Ruby中,方法的返回值return可以省略,Ruby默认将方法中的最后一行代码产生的值return。并且,方法后面的括号可以省略。省略无下限啊。。。

 

 

7.Yield

在方法中使用yield可以執行Code block參數:

# 定義方法
def call_block
    puts "Start"
    yield
    yield
    puts "End"
end

call_block { puts "Blocks are cool!" }
# 輸出
# "Start"
# "Blocks are cool!"
# "Blocks are cool!"
# "End"
帶有參數的Code block
def call_block
    yield(1)
    yield(2)
    yield(3)
end

call_block { |i|
    puts "#{i}: Blocks are cool!"
}
# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"
Proc object

可以將Code block明確轉成一個變數:

def call_block(&block)
    block.call(1)
    block.call(2)
    block.call(3)
end

call_block { |i| puts "#{i}: Blocks are cool!" }

# 或是先宣告出 proc object
proc_1 = Proc.new { |i| puts "#{i}: Blocks are cool!" }
proc_2 = lambda { |i| puts "#{i}: Blocks are cool!" }

call_block(&proc_1)
call_block(&proc_2)

# 輸出
# "1: Blocks are cool!"
# "2: Blocks are cool!"
# "3: Blocks are cool!"

 

 

 

8、数组的输出-join方法

print arr.join(", ")."\n" 意思是:将数组 arr转换成字符串输出,用", "隔开每个

元素,并且换行。一个数组可以用join方法转换成字符串,join()内的参数也是一个字符串,用来分隔数组的每个元素,例如:arr.join(",")。

arr=[3,4,5]

print arr #输出:345

print arr.join(", ") #输出:3,4,5

 

 

9、Ruby中的yield

 

可以用大括号{ }将代码组织成块,也可以用 do…end 将代码组织成块。大括号{ }的优先级高于 do…end。代码块,简称块。

yield [ji:ld] 产生,输出……

注意:{}或者do…end之间的是块。

 

 

#E8.4-1.rb

def one_block

yield

yield

yield

end

 

one_block { puts "This is a block." }

代码块

 

把块作为参数,带入到def定义中的yield处即可。

调用一次块要用关键字yield。每一次yield,块就被调用一次。

yield还可以带参数调用块,yield后面是实参,块定义处是形参。

一个块可以接收yield传来的参数,还可以将结果返回给调用它的方法。

 

10、闭包

代码块是一段代码,相当于一个匿名方法,被调用它的方法所调用。

如果我们不仅仅想调用代码块,还想把代码块作为参数传递给其它方法,就要使用闭包。

闭包也是一段代码,一个代码块,而且能够共享其它方法的局部变量。

闭包既然是一段代码,也就有自己的状态,属性,作用范围,也就是一个可以通过变量引用的对象,我们称之为过程对象

一个过程对象用 proc 创建,用 call 方法来调用。

¨ 闭包作为参数传递给其它方法

以下两个程序相同

 

程序1

程序2

def method(pr)

puts pr.call(7)

end

 

oneProc=proc{|k| k *=3}

method(oneProc)

oneProc=proc{|k| k *=3}

 

puts oneProc.call(7)

#过程对象oneProc作为一个参数,传递给method;

 

 

¨ 闭包共享其它方法局部变量

 

def method(n)

return proc{|i| n +=i }

end

 

oneProc=method(3)

puts oneProc.call(9) #12

puts oneProc.call(5) #17

方法method返回一个Proc对象,这个对象引用了函数的参数n。即使参数n在闭包被调用时已经不在自己的作用域里,这个闭包还是可以访问参数n,并且和方法method共同拥有变量n。开始时方法method的变量n是3;oneProc.call(9)的时候,oneProc 更新了变量n,把n=12 传回给方法method;oneProc.call(5)的时候,oneProc取出方法 method 的变量 n=12,更新为n=17,传回给方法method的同时,也把n=17作为自己的返回值输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值