1。each、map与collect
(1)each方法是典型的迭代器,它的作用是可以遍历数组中的所有元素,并对其进行处理,但不改变原数组的值,返回结果也是原数组的值。1
2
3
4
5
6sum = 0
a = [1,2,3,4,5]
a.each do |item|
sum+=item
end
print sum #=> 15
1 | a = [1,2,3,4,5] |
(2) 使用map与collect方法会形成一个新数组,原数组的值不变。1
2
3
4
5
6
7
8
9a = [1,2,3,4,5]
a.each{ |item| item*2} #=> [1,2,3,4,5]
a #=> [1,2,3,4,5]
a.map{ |item| item*2} #=>[2,4,6,8,10]
a #=> [1,2,3,4,5]
a.collect{ |item| item*2} #=> [2,4,6,8,10]
a #=> [1,2,3,4,5]
(3)使用map!与collect!会形成一个新的数组,并改变原数组的值。1
2
3
4
5
6a = [1,2,3,4,5]
a.map!{ |item| item*2} #=> [2,4,6,8,10]
a #=> [2,4,6,8,10]
a.collect!{ |item| item*2} #=> [2,4,6,8,10]
a #=> [2,4,6,8,10]
2。作用域
(1)作用域门1
2
3
4
5
6
7
8
9
10
11
12
13v1 = 1
class Myclass
v2 = 2
local_variables #=> [:v2]
def my_method
v3 = 3
local_variables
end
local_variables #=> [:v2]
end
obj = Myclass.new
obj.my_method #=> [:v3]
当进行类定义(关键字:class)、模块定义(module)、方法定义(def)会产生作用域。
(2)穿越作用域1
2
3
4
5
6
7
8
9
10
11var = "scope"
class Myclass
puts "#{var}"
def my_method
end
end
#=> NameError: undefined local variable or method `var' for Myclass:Class
得: 局部变量无法穿过Myclass的作用域
1 | var = "scope" |
1 | var = "scope" |
3. 单引号和多引号的区别
Ruby中生成字符串有两种方式,单引号和双引号,其中单引号不被转义,多引号会被转义。1
2$ name = "jonathan" # => "jonathan"
$ string = "#{name}" # => "jonathan"
1 | $ name = 'jonathan' # => "jonathan" |
4. Symbol
在散列中会常常用到符号(Symbol)。例如address = { :name => "joanathan", :phone => "123456"} 其中:name :phone 就是符号。符号可以和字符串相互转换。1
2
3
4
5name = :jonathan #=> :jonathan
等同于 name = :"jonathan"
name1 = name.to_s #=> "jonathan"
name1.to_sym #=> :jonathan
5. Ruby中的实例变量
(1)Ruby中的对象包含实例变量,如果想要对象中的实例变量,需要调用对象的方法。示例代码:1
2
3
4
5
6
7
8
9
10
11
12
13
14class Person
def name
@name = "Tim"
end
def name=(vaule)
@name = vaule
end
def kill
@killer = name
end
end
下面就来做些小实验来验证需要调用方法才能访问对象中的实例变量。1
2
3tim = Person.new
puts tim.name #=> "Tim"
puts tim.instance_variables #=> [:@name] 此时没有调用kill方法,所以在tim这个对象调用instance_variables这个方法时没有@killer这个实例变量
1 | tim = Person.new |
1 | Tim = Person.new |
由此得知:Ruby如果想要访问对象中的实例变量或对其赋值,那么就需要调用对象的方法。
(2)存取器
存取器的定义为attr_accessor ,Ruby元编程中称为”类宏”,例如1
2
3
4
5
6
7
8
9
10
11
12
13
14class Person
attr_accessor :name
end
相当于
class Person
def name
@name = "Tim"
end
def name=(vaule)
@name = vaule
end
end
1 | tim = Person.new |
1 | tim = Person.new |
6. << 符号
在数组中,经常会用到 <<,示例代码:1
2
3ary = [1,2,3]
ary << 4
ary = [1,2,3,4]