下面是用实际代码演示Ruby的容易被误解的6个特性的完整攻略。
1. 变量作用域
Ruby 中的变量作用域可能会让人感到有些混乱。首先,Ruby 有全局变量、实例变量、类变量和局部变量四种。而且,Ruby 采用的是静态作用域,也就是说,变量的作用域是在写代码时决定的,而非在运行时决定的。
$a = 10
def test
puts $a
end
test # 输出10
上述代码定义了全局变量 $a
,并在 test
方法中输出 $a
。由于 $a
是全局变量,因此 test
方法中可以直接访问到 $a
。
而对于实例变量、类变量和局部变量,则分别使用 @
、@@
和无修饰符的变量名来定义。
class Test
def initialize
@a = 1
@@b = 2
c = 3
end
def test
puts @a # 输出1
puts @@b # 输出2
# puts c # 报错 NameError
end
end
t = Test.new
t.test
上述代码定义了一个 Test
类,其中在 initialize
方法中分别定义了实例变量 @a
、类变量 @@b
和局部变量 c
。在 test
方法中,可以直接访问 @a
和 @@b
,但无法访问 c
。
2. 方法和符号
Ruby 中的方法调用有时会出现一些迷惑性的情况,特别是和符号混用的时候。在 Ruby 中,符号被认为是一种轻量级的字符串表示,通常用来表示不需要改变的东西(例如方法名、哈希键名等)。而对于方法调用,可以使用点号或者空格。
class Test
def hello
puts 'hello'
end
end
t = Test.new
# 使用点号调用方法
t.hello # 输出hello
# 使用空格调用方法
t.send(:hello) # 输出hello
t.send('hello') # 输出hello
# 使用符号调用方法
t.send(:hello) # 输出hello
t.send('hello') # 报错 NoMethodError
上述代码定义了一个 Test
类,其中包含了一个 hello
方法。在 t
对象上,既可以使用点号调用方法,也可以使用空格调用方法。而对于符号,需要使用 send
方法来进行调用,而不能直接使用点号或者空格。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:用实际代码演示Ruby的容易被误解的6个特性 - Python技术站