ruby 变量定义详解

作者:袖梨 2022-06-25

Ruby变量名的首位字符来确定它是局部变量、实例变量、类变量、全局变量还是常数。通常情况下,变量名的第二位字符以后是数字、字母或下划线,但有的内部变量名比较特殊
s = 'Hello World!'
x = 10
# p004stringusage.rb
# Defining a constant
PI = 3.1416
puts PI
# Defining a local variable
myString = 'I love my city, Pune'
puts myString
=begin
Conversions
.to_i, .to_f, .to_s
=end
var1 = 5;
var2 = '2'
puts var1 + var2.to_i
# << appending to a string
a = 'hello '
a<<'world.
I love this world...'
puts a
=begin
<< marks the start of the string literal and
is followed by a delimiter of your choice.
The string literal then starts from the next
new line and finishes when the delimiter is
repeated again on a line on its own.
=end
a = < This is the string
And a second line
END_STR
puts a
变量的命名有一定规则:以小写字母或下划线开头,变量中只能包含字母,数字和下划线。关键字不能作为变量名使用。
当ruby解释器读到一个单词的时候,他会把他解释成变量名,方法名或者保留关键字中的一种。
如果单词的后面跟一个“=”,说明是一个变量;如果是一个关键字,那就只能作为关键字使用;其他情况视为方法名。
在下面的例子中:
x = "100".to_i
“.”的意思是方法to_i被字符串“100”调用。
字符串“100”是方法的调用者。
“.”前面的对象和后面的方法是调用和被调用的关系。


看一下关于ruby变量分类总结

局部变量
例:

foobar
若标识符首位是小写字母或“_”,则该标识符就是局部变量或方法调用。在局部变量的作用域(类、模块、方法的定义部分)内,若对一个首位是小写字母的标识符进行首次赋值的话,也就意味着声明了一个属于该作用域的局部变量。若引用尚未被声明的标识符的话,就会被解释成一个无参数的方法调用。

局部变量的作用域起始于声明处,结束于该声明所在的块、方法定义、类/模块定义的结尾。随着块的消亡,局部变量也将寿终正寝(顶层局部变量则一直持续到程序终结),但也有例外。若块已经变成过程对象的话,则局部变量将一直持续到该过程对象终结为止。若多个过程对象引用同一个作用域的话,局部变量将被这些对象所共享。

# (A)的部分位于作用域之外
2.times {
  p defined?(v)    # (A)
  v = 1            # 从(开始声明)起
  p v              # 到(块的终结)是 v 的作用域
}

# => nil
     1
     nil           <- 请注意这里是 nil
     1
即使声明部分未被执行仍将有效。

v = 1 if false # 虽未赋值,但声明有效
p defined?(v)  # => "local-variable"
p v            # => nil
若使用了 -K 选项的话就可以使用日语标识符,日语标识符被当作局部变量处理。实际上,我们并不推荐您这样做。

实例变量
例:

@foobar
以@开始的变量是实例变量,它属于特定的对象。可以在类或子类的方法中引用实例变量。若引用尚未被初始化的实例变量的话,其值为nil。

类变量
例:

class Foo
  @@foo = 1
  def bar
    puts @@foo
  end
end
以@@开始的变量是类变量。在类的定义中定义类变量,可以在类的特殊方法、实例方法等处对类变量进行引用/赋值。

类变量与常数的区别如下。

可以重复赋值(常数则会发出警告)
不能在类的外部直接引用(在继承类中则可以引用/赋值)
类变量与类的实例变量的区别如下。

可在子类中引用/赋值
可在实例方法中引用/赋值
可以把类变量看作一种被类、子类以及它们的实例所共享的全局变量。

class Foo
  @@foo = 1
end
class Bar < Foo
  p @@foo += 1          # => 2
end
class Baz < Bar
  p @@foo += 1          # => 3
end
模块中定义的类变量(模块变量)被所有包含该模块的类所共享。

module Foo
  @@foo = 1
end
class Bar
  include Foo
  p @@foo += 1          # => 2
end
class Baz
  include Foo
  p @@foo += 1          # => 3
end
全局变量
例:

$foobar
$/
以$开始的变量是全局变量,可以在程序的任何地方加以引用(因此需要特别留意)。全局变量无需变量声明。引用尚未初始化的全局变量时,其值为 nil。

伪变量
除普通的变量之外,还有一种叫做伪变量的特殊变量。

self
当前方法的执行主体

nil
NilClass类的唯一实例

true
TrueClass类的唯一实例

false
FalseClass类的唯一实例。nil 和 false 表示“伪”。

__FILE__
当前源文件名

__LINE__
当前源文件中的行号

伪变量的值不可改变,若对伪变量赋值将引发语法错误

相关文章

精彩推荐