Ruby for Rails 最佳实践七
2013-10-08 14:27
465 查看
第七章 默认对象(self)和作用域
一、理解当前对象或默认对象 self1. 在不同上下文中判定 self
puts "Tol Level"
puts "self is #{self}" #输出 main
class C
puts "Class definition block:"
puts "self is #{self}" #输出 C
def self.x
puts "Class method C.x:"
puts "self is #{self}" #输出 C
end
def m
puts "Instance method C#x:"
puts "self is #{self}" #输出 #<C:0x2c029b4>
end
end
2. 在类和模块定义中的 self
class C
puts "Just started class C:"
puts self #输出 C
module M
puts "Nested module C::M:"
puts self #输出 C::M
end
puts "Back in the outer level of C:"
puts self #输出 C
end
3. 单例方法定义和类方法定义中的 self
(1)在执行单例方法时,self 是拥有该方法的对象
obj = Object.new
def obj.show_me
print "I'm an object; "
puts "here's self inside a singleton method of mine:"
puts self
end
obj.show_me
print "And inspecting obj from outside, "
puts "to be sure it's the same object:"
p obj
输出结果
I'm an object; here's self inside a singleton method of mine:
#<Object:0x2c02dec>
And inspecting obj from outside, to be sure it's the same object:
#<Object:0x2c02dec>
(2)类方法中的 self 就是类本身,因此
class C
def C.x
puts "Class method of class C"
puts self
end
end
等同于
class C
def self.x
puts "Class method of class C"
puts self
end
end
二、确定作用域
1. 全局变量具有全局作用域,全局变量通过变量名前加美元符号($)来识别$gvar = "I'm a global!"
class C
def examine_global
puts $gvar
end
end
C.new.examine_global
2. Ruby 内建全局变量
(1)$0 包含了 Ruby 正在执行的文件的名字
(2)$: 包含了一些目录,在加载一个外部文件时,这些目录构成了 Ruby 搜索路径
(3)$$ 包含了 Ruby 进程的进程ID
3. 全局变量使用范例
class Work
def show_info
puts "Title and composer: #{$title}, #{$composer}"
end
end
work = Work.new
$composer = "Giuseppe Verdi"
$title = "La Traviata"
work.show_info
3. 局部作用域
class C
a = 5
module M
a = 4
module N
a = 3
class D
a = 2
def show_a
a = 1
puts a
end
puts a #输出 2
end
puts a #输出 3
end
puts a #输出 4
end
puts a #输出 5
end
d = C::M::N::D.new
d.show_a #输出 1
4. 常量的作用域和解析
module M
class C
X = 2
class D
module N
X = 1
end
end
end
end
puts M::C::D::N::X #输出 1
puts M::C::X #输出 2
5. 强制使用绝对常量路径(::)
class Violin
# Violin 中再创建一个 String 类
class String
attr_accessor :pitch
def initialize(pitch)
@pitch = pitch
end
end
# 如果想调用 Ruby 自带的 String 类,则使用 ::String.new(args)
def history
::String.new(maker + ", " + Date)
end
end
三、部署访问权限规则
1. 私有方法:Ruby 通过禁止对私有方法使用显式的接收者来获得私有特性,在所有可以省略接收者的场合,调用私有方法是没问题的class C
private
def sayHello
puts "hello"
end
#或者使用 private :sayHello
end
2. 保护方法:只要默认对象(self)和你想调用的方法所属的对象是同一类的实例,你就可以调用该保护方法
class C
def initialize(n)
@n = n
end
def n
@n
end
def compare(c)
if c.n > n
puts "The other object's n is bigger."
else
puts "The other object's n is the same or smaller."
end
end
protected :n
end
c1 = C.new(100)
c2 = C.new(101)
c1.compare(c2)
3. 公有方法:默认的访问级别
四、编写和使用顶层方法
1. 预定义的(内建的)顶层方法:如 puts 和 print 都是 Kernel 内建的私有实例方法。2. 查看所有内建私有实例方法:puts Kernel.private_instance_methods.sort
相关文章推荐
- Ruby for Rails 最佳实践Ⅵ
- Ruby for Rails 最佳实践Ⅳ
- Ruby for Rails 最佳实践Ⅴ
- Ruby for Rails 最佳实践Ⅲ
- Ruby for Rails 最佳实践Ⅱ
- Ruby for Rails 最佳实践Ⅰ
- Rubinius 2.0 发布,Ruby 虚拟机
- Why the framework uses ruby instead of perl?[转]
- rubymine创建rails项目图
- [Ruby on Rails Tutorial]04-Rails 背后的 Ruby
- windows 下搭建ruby on rails+Mysql开发环境
- ruby on rails 工具aptana清日志指令
- ruby render与redirect_to
- [Ruby on Rails Tutorial]02-演示程序演示程序
- [Ruby on Rails Tutorial]01-使用Heroku部署应用程序
- Ruby代码块(Block)
- Ruby模块(module)
- Ruby迭代器(Iterator)
- Ruby中print、p、puts的区别
- Ruby 事务Blocks