类变量:
类似于java中的static属性,所有类的实例访问相同的一个内存地址。类似c中的文件受控全局变量。
class Song
@@plays=0 #类变量
...
...
end
静态方法:
类似java中的static方法。
class Example
def instance_method
end
#方法名前带类名就是静态方法
def Example.class_method
end
end
单例(单根模式):
#!/usr/bin/env ruby
class MyLogger
private_class_method :new
@@logger = nil
def MyLogger.create #这是个静态方法。
@@logger = new unless @@logger
@@logger
end
end
如果定义方法时在最后一个参赛前加&,那么当调用该方法时,Ruby会寻找一个block。block将会被转化成Proc类的一个对象,并被赋值给参数。这样可以像任意其它变量一样处理该参数。
sonlist = SongList.new
class JukeboxButton < Button
def initialize(label,&action)
super(label)
@action = action
end
def button_pressed
@action.call(self)
end
end
start_button = JukeboxButton.new("Start"){sonlist.start}
pause_button = JukeboxButton.new("Pause"){sonlist.pause}
判断是否带block:
def take_block(p1)
if block_given? #这个方法判断是否带block
yield(p1)
else
p1
end
end
puts take_block("no block")
puts take_block("no block"){|s| s.sub(/no /,"")}
灵活的if 和 unless:
File.foreach("/etc/fstab") do |line|
next if line =~/^#/
puts(line) unless line=~/^$/ #打印非空行
end
load实现的动态加载:
5.times do |i|
File.open("Temp.rb","w") do |f|
f.puts "module Temp"
f.puts " def Temp.var"
f.puts " #{i}"
f.puts " end"
f.puts "end"
end
load 'Temp.rb'
puts Temp.var
end