MST
星途 面试题库

面试题:Ruby变量作用域与数据类型转换

在Ruby中,局部变量、实例变量、类变量和全局变量的作用域分别是怎样的?请举例说明。另外,如何将一个字符串类型的数据转换为整型数据,有哪些方法,各有什么特点?
17.8万 热度难度
编程语言Ruby

知识考点

AI 面试

面试题答案

一键面试

1. 变量作用域

  • 局部变量:作用域仅限于定义它的方法、块或局部作用域内。例如:
def local_variable_example
  local_var = "这是一个局部变量"
  puts local_var
end
local_variable_example
# 这里如果试图访问 local_var 会报错,因为超出了作用域
  • 实例变量:以 @ 开头,作用域是对象实例,同一个类的不同实例之间实例变量相互独立。例如:
class InstanceVariableExample
  def initialize
    @instance_var = "这是一个实例变量"
  end

  def print_instance_variable
    puts @instance_var
  end
end

obj1 = InstanceVariableExample.new
obj1.print_instance_variable
obj2 = InstanceVariableExample.new
obj2.instance_variable_set(:@instance_var, "obj2的实例变量")
obj2.print_instance_variable
obj1.print_instance_variable
  • 类变量:以 @@ 开头,作用域是整个类及其子类。类变量在整个类层次结构中是共享的。例如:
class ClassVariableExample
  @@class_var = "这是一个类变量"

  def self.print_class_variable
    puts @@class_var
  end

  def change_class_variable
    @@class_var = "类变量被修改了"
  end
end

ClassVariableExample.print_class_variable
obj = ClassVariableExample.new
obj.change_class_variable
ClassVariableExample.print_class_variable

class SubClass < ClassVariableExample
  def self.print_subclass_class_variable
    puts @@class_var
  end
end

SubClass.print_subclass_class_variable
  • 全局变量:以 $ 开头,作用域是整个程序。例如:
$global_var = "这是一个全局变量"

def print_global_variable
  puts $global_var
end

print_global_variable

2. 字符串转整型

  • to_i 方法:将字符串转换为整数,如果字符串开头不是数字则返回0。特点是简单直接,忽略非数字部分。例如:
str1 = "123"
str2 = "abc123"
puts str1.to_i
puts str2.to_i
  • Integer() 方法:尝试将字符串转换为整数,如果字符串不是有效的整数表示形式则抛出 ArgumentError 异常。例如:
str1 = "123"
str2 = "abc123"
puts Integer(str1)
# 下面这行代码会抛出异常
# puts Integer(str2) 
  • Kernel#atoi 方法:和 to_i 类似,将字符串转换为整数,从字符串开头解析,遇到非数字字符停止。例如:
str1 = "123"
str2 = "abc123"
puts atoi(str1)
puts atoi(str2)