面试题答案
一键面试符号(Symbol)
- 特性:
- 符号在内存中是唯一的,无论在代码的何处使用相同的符号字面量,它们都指向同一个内存地址。这是因为符号表是一个全局的、唯一的表,当创建一个新符号时,Ruby会首先检查符号表中是否已经存在该符号,如果存在则返回已有的符号对象。
- 符号是不可变的,一旦创建,其值就不能改变。
- 优势:
- 内存效率高,由于符号在内存中唯一,对于频繁使用且值固定的标识符(如方法名),使用符号可以节省内存。例如在一个大型应用中,大量对象可能会调用同一个方法,使用符号作为方法名在内存方面会更高效。
- 比较速度快,因为符号的唯一性,比较两个符号只需要比较它们的内存地址,而不需要逐个比较字符串的字符,所以比较操作更迅速。
- 陷阱:
- 符号不能直接修改,这意味着如果需要动态生成一个类似但有细微差别的标识符,使用符号就不太方便。例如,如果要根据用户输入动态生成方法名,由于符号不可变,处理起来相对困难。
- 符号没有像字符串那样丰富的方法集,比如符号不能像字符串那样进行格式化操作。
字符串(String)
- 特性:
- 字符串是可变的,可以通过各种方法修改其内容,例如
string << 'new content'
可以在字符串末尾追加新内容。 - 字符串对象在每次创建时(除非使用
freeze
方法)都会在内存中分配新的空间,即使内容相同的字符串也会是不同的对象。
- 字符串是可变的,可以通过各种方法修改其内容,例如
- 优势:
- 灵活性高,由于字符串可变且有丰富的方法集,可以方便地进行各种文本处理,包括格式化、拼接等操作。例如在根据不同条件动态生成方法名时,字符串操作起来更便捷。
- 可读性好,在一些需要显示给用户的文本相关场景中,字符串更直观,因为它们可以包含各种字符组合,而符号通常只用于标识符。
- 陷阱:
- 内存开销大,因为每个字符串对象都需要分配新的内存空间,对于大量重复内容的字符串,会占用较多内存。
- 比较操作相对较慢,因为需要逐个比较字符串的字符,不像符号直接比较内存地址。
代码示例对比
class SymbolVsString
def method_with_symbol(symbol_name)
send(symbol_name)
end
def method_with_string(string_name)
send(string_name)
end
def test_method
puts 'This is a test method'
end
end
sym = :test_method
str = 'test_method'
obj = SymbolVsString.new
obj.method_with_symbol(sym)
obj.method_with_string(str)
在上述代码中:
- 使用符号作为方法名传递给
send
方法,利用了符号的内存高效和比较快速的特性。 - 使用字符串作为方法名传递给
send
方法,体现了字符串的灵活性,如动态生成方法名时可以先对字符串进行各种处理后再传递给send
方法。但要注意字符串在内存使用和比较速度方面的劣势。