代码块
1.什么是块?
块由大量的代码组成;
代码包含在大括号或者 do…end
内;
块只能跟在方法调用之后,例如您的块名称为 block\_te
,那么必须要 block\_te
函数来调用块。
定义:
block_name{
statements
}
2.yield语句
Tips:在方法内部,yield
的作用是占位,当方法执行到 yield 时实际执行的是代码块中的内容; |X|
是在代码块中使用的,用于接收 yield
传递的参数,且参数传给 X
。
范例:
#!/usr/bin/ruby #文件名为yield_NO.rb
def test
puts "You are in the method"
yield #执行代码块
puts "You are again back to the method"
yield #执行代码块
end
test {puts "You are in the block"}
运行:
$ruby yield_NO.rb
#!/usr/bin/ruby #文件名为yield_YES.rb
def test
yield 5 #执行代码块
puts "You are in the method test"
yield 100 #执行代码块
end
test {|i| puts "You are in the block #{i}"}
运行:
$ruby yield_YES.rb
3. BEGIN 和 END 块
BEGIN 和 END 块分别定义程序被加载就执行的代码块和程序结束时执行的代码块。
范例: #!/usr/bin/ruby #文件名为be_and_in.rb
BEGIN {
#BEGIN 代码块
puts "BEGIN code block."
}
END {
#END 代码块
puts "END code block."
}
puts "MAIN code."
运行:
$ ruby be_and_in.rb
三、运算符
1.与其他语言的运算符关系
在 Ruby 中很多的运算符跟其他语言都是相同的,(比如基本的 +、-、*、/
算术运算 ,以及位运算和逻辑运算等)但是还是有一部分是不一样的,下面将对 Ruby 的部分运算符进行操作实验。
2.比较运算符
.eql?
:如果原参数与接收到的参数具有相同的类型和值,则返回 true
。
范例:
2.eql?(2.0) 返回 false
equal?
:如果原参数与接收到的参数具有相同的对象 id
,则返回 true。
3.并行赋值
范例:
a,b,c=10,20,30
等价于:
a=10 b=20 c=30
4.变量交换
a,b=b,a
交换了 a 和 b 的值,也可以多个变量同时交换
5.三元运算符
三元运算符 -?:
范例:
a>b?c=b:c=a
#如果a大于b则将b的值赋给c,否则将a的值赋给c
6.范围运算符
在 Ruby 中有两个范围运算符,分别是 ..
和 …
..
:表示创建一个从开始点到结束点的范围(包含结束点)
…
:表示创建一个从开始点到结束点的范围(不包含结束点)
范例:
1..10
#创建从1到10的范围
1…10
#创建从1到9的范围
7.defined?运算符
defined?
运算符是以调用相关方法的形式来判断传递的参数是否已经定义,如果表达式未定义则返回 nil,如果已定义则会返回参数描述。
范例:
#!/usr/bin/ruby #文件名为defined.rb
a=100
puts “a is defined?”,defined? a
puts “test is defined?”,defined? test
运行:
8.点运算符和双冒号运算符
在 Ruby 中类和方法都可以被当做常量来使用 ::
运算符: 可以使用一个模块名称和双冒号来引用一个常量; 双冒号运算符允许在类或模块内定义常量、实例方法和类方法,可以从类或模块外的任何地方进行访问。
范例:
#!/usr/bin/ruby #文件名为const_te.rb
CONST = ' out there' #定义常量
class Inside_one
CONST = proc {' in there'}
def where_is_my_CONST
::CONST + ' inside one' #引用常量
end
end
class Inside_two
CONST = ' inside two'
def where_is_my_CONST
CONST
end
end
puts Inside_one.new.where_is_my_CONST
puts Inside_two.new.where_is_my_CONST
puts Object::CONST + Inside_two::CONST
puts Inside_two::CONST + CONST
puts Inside_one::CONST
puts Inside_one::CONST.call + Inside_two::CONST
若未使用前缀表达式,则默认使用主 Object 类。 Proc 是对块及其 context(局部变量的作用域以及栈框架)进行对象化处理之后得到的过程对象。