Ruby中的變量

Ruby中的變量

在 php?name=Ruby" onclick="tagshow(event)" class="t_tag">Ruby中,變量的使用不需要事先聲明。任何一個標識符,在被賦值的那一刻就成為了變量。按照作用域來分,變亮分為:全局變量,局部變量,實例變量,類變量和一些特殊含義的保留變量等。

一局部變量。在Ruby中,如果一個標識符的首位字母是小寫字母或下划線(例如:_aa,_bb),那么這個標識符就是局部變量。(特別的:如果標識符前面有“def”保留字,則是方法調用)。局部變量在賦值是即被聲明,如果第一次調用之前沒有聲明,則會拋出异常。局部變量的作用域開始于變量第一次賦值處,結束于該變量所在的塊,方法定義或類、模塊定義的作用域的結尾。
1.times{
 p defined?(var)
 var=1
 p defined?(var)
 p var
}

結果:
nil
"local-variable(in-block)"
1

此外在條件分支中也可以聲明局部變量:
a=1
var=10 if a==0
p defined?(var)
p var


輸出結果:
"local-variable"
nil

二全局變量。在Ruby中以$開頭的變量稱為全局變量。它的生命周期會一直持續,直到其被消除定義為止。全局變量無需聲明,賦值前為nil.
$global=1
def testfoo(var)
 if $global<10
  $global+=1
 else
  return $global
 end 
  testfoo($global)
end

puts testfoo($global)

輸出結果:
10

三實例變量。在Ruby中的實例變量就是類的成員變量,以“@”符號開頭,例如變量“@var”就是一個實例變量。實例變量是私有可繼承變量,不能供外部訪問。如果要訪問該類變量,必須使用模塊方法:attr,attr_reader,attr_accessor和 attr_write來聲明訪問的方法。
class Foo
 attr:var
 def initialize
  @var='var'
 end
end

p Foo.new.var

輸出結果:
"var"

四類變量。Ruby的類變量可以看作一种被類,子類以及它們的實例所共享的類的全局變量,与類相關而与實例無關,類似于其它語言中的靜態變量。Ruby的類變量以@@開頭。如:
class Foo
 @@cvar=1
 def method
  puts @@cvar
 end
end

類變量和實例變量的主要區別是:類變量的生存不依賴于對象實例,而實例變量的生存依賴于對象實例。
class Foo
 @@cvar=1
 def out
  puts @@cvar
 end
end

class Foo0<Foo
 p @@cvar+=1
end

class Foo1<Foo
 p @@cvar+=1
end

b=Foo.new
b.out

輸出結果:




和C++中的靜態變量不同,Ruby中的子類可以操作父類的類變量。因此可以人為:類變量只是生存在類的名字空間(namespace)的全局變量。定義在模塊中的類變量可以被所有包含它的類所共享。例如:
module ModuleA
 @@mvar=1
end

class ClassA
 include ModuleA
 p @@mvar+=1
end

class ClassB
 include ModuleA
 p @@mvar+=1
end

輸出結果:
2
3

五特殊變量。true/false,self,_FILE_,_LINE_,nil。
引用:
原帖由 zhuzhao 于 2007-11-18 10:25 发表
在 Ruby中,變量的使用不需要事先聲明。任何一個標識符,在被賦值的那一刻就成為了變量。按照作用域來分,變亮分為:全局變量,局部變量,實例變量,類變量和一些特殊含義的保留變量等。

一局部變量。在Ruby ...
执行以上代码
创建后缀为.rb的文件 然后右击,编辑,把以上代码输入,完成后,点击键盘F5 或者菜单栏中TOOL->GO,运行

小问下 p 方法输出是 puts 还是 print? .out也是输出方法吗?在RB中没有查到。。。
p方法是kernel的方法,文档上这么解释:For each object, directly writes obj.inspect followed by the current output record separator to the program’s standard output.

这个方法的层次比较高
p.class.superclass #=> Object
他的上层就是根对象了
这年代想当新手也不容易......
P
对于每个对象,输出obj.inspect后跟当前输出记录分隔符到程序的标准输出。
S = Struct.new(:name, :state)
s = S['dave', 'TX']
p s
=>
#<struct S name="dave", state="TX">
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~PR如此....
估计用到了才能理解了