Ruby 基础--学习笔记

1。each、map与collect

(1)each方法是典型的迭代器,它的作用是可以遍历数组中的所有元素,并对其进行处理,但不改变原数组的值,返回结果也是原数组的值。

1
2
3
4
5
6
sum = 0
a = [1,2,3,4,5]
a.each do |item|
sum+=item
end
print sum #=> 15

1
2
3
a = [1,2,3,4,5]
a.each{ |item| item*2} #=> [1,2,3,4,5]
a #=> [1,2,3,4,5]

(2) 使用map与collect方法会形成一个新数组,原数组的值不变。

1
2
3
4
5
6
7
8
9
a = [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
6
a = [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
13
v1 = 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
11
var = "scope"
class Myclass
puts "#{var}"

def my_method
end
end

#=> NameError: undefined local variable or method `var' for Myclass:Class

得: 局部变量无法穿过Myclass的作用域

1
2
3
4
5
6
7
8
9
10
11
12
13
var = "scope"
Myclass = Class.new do
puts "#{var} in the #{self.class}"
def my_method
puts "#{var}"
end
end
#=> scope in the Class
#=> undefined local variable or method `my_var' for Myclass:Class (NameError)

得:
(1)通过方法调用可以让局部变量穿过Myclass的作用域;
(2)局部变量var无法穿过my_method的作用域。
1
2
3
4
5
6
7
8
9
10
11
12
13
var = "scope"
Myclass = Class.new do
puts "#{var} in the #{self.class}"
define_method :my_method do
puts "#{var} in the #{self.class}"
end
end

obj = Myclass.new
obj.my_method

#=> scope in the Class
#=> scope in the Myclass

3. 单引号和多引号的区别

Ruby中生成字符串有两种方式,单引号和双引号,其中单引号不被转义,多引号会被转义。

1
2
$ name = "jonathan" #  => "jonathan"
$ string = "#{name}" # => "jonathan"

1
2
$ name = 'jonathan' # => "jonathan"
$ string = '#{name}' # => "\#{name}"

4. Symbol

在散列中会常常用到符号(Symbol)。例如address = { :name => "joanathan", :phone => "123456"} 其中:name :phone 就是符号。符号可以和字符串相互转换。

1
2
3
4
5
name = :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
14
class Person

def name
@name = "Tim"
end

def name=(vaule)
@name = vaule
end

def kill
@killer = name
end
end

下面就来做些小实验来验证需要调用方法才能访问对象中的实例变量。

1
2
3
tim = Person.new
puts tim.name #=> "Tim"
puts tim.instance_variables #=> [:@name] 此时没有调用kill方法,所以在tim这个对象调用instance_variables这个方法时没有@killer这个实例变量

1
2
3
4
tim = Person.new
puts time.name #=> "Tim"
puts tim.killer #=> "Tim"
puts tim.instance_variables #=> [:@name, :@killer]
1
2
Tim = Person.new
puts Time.name = "Jonathan" #=> "Jonathan"

由此得知:Ruby如果想要访问对象中的实例变量或对其赋值,那么就需要调用对象的方法。
(2)存取器
存取器的定义为attr_accessor ,Ruby元编程中称为”类宏”,例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person
attr_accessor :name
end

相当于
class Person
def name
@name = "Tim"
end

def name=(vaule)
@name = vaule
end
end

1
2
3
tim = Person.new
p tim.name = "Jonathan" #=> "Jonathan"
p tim.name #=> "Jonathan"
1
2
3
tim = Person.new
p tim.name #=> nil 因为@name的值为空
p tim.name = "Joanthan" #=> "Jonathan"

6. << 符号

在数组中,经常会用到 <<,示例代码:

1
2
3
ary = [1,2,3]
ary << 4
ary = [1,2,3,4]