我想了解在Ruby中做什么符号的程度。我知道使用符号作为键而不是字符串的速度更快,效率更高,但速度如何?为什么将方法创建为符号很重要?
从我的理解,参考方法时,它必须表示为符号:to_i
而不是to_i
。这样做的目的是什么?
我想了解在Ruby中做什么符号的程度。我知道使用符号作为键而不是字符串的速度更快,效率更高,但速度如何?为什么将方法创建为符号很重要?
从我的理解,参考方法时,它必须表示为符号:to_i
而不是to_i
。这样做的目的是什么?
在Ruby中,一个符号仅仅是一个不可改变的字符串:
"hello " + "world" #=> "hello world"
:hello_ + :world #=> NoMethodError: undefined method `+' for :hello:Symbol
不可变使得符号的安全和可靠的参考,例如:
Object.methods => [:new, :allocate, :superclass, #etc..]
如果红宝石是在这里使用的字符串,用户将能够修改字符串,从而毁坏将来的电话Object.methods
。这可以通过在每次调用方法时创建字符串副本来解决,但这会占用大量内存。
事实上,因为红宝石知道符号永远不会被修改,这样可以节省每个符号只有一次,无论多少次,你把它声明:
"hello".object_id #=> 9504940
"hello".object_id #=> 9565300
:hello.object_id #=> 1167708
:hello.object_id #=> 1167708
这需要符号的节省内存的潜力甚至更进一步,允许您在任何地方和任何地方在代码中使用符号文字,而只需很少的内存开销。
因此,对您的问题的回合答案:符号不能被修改,但它们更安全,更有效;因此,只要你有一个你认为不应该修改的字符串,就应该使用它们。
符号被用作键哈希因为:
my_hash[:test]
,所以它使用符号更具有内存效率。至于方法参考:你不能直接引用一个方法,即send(my_method())
,因为不能区分传递方法和执行方法。字符串可以在这里使用,但由于方法的名字一旦定义就不会改变,因此将名称表示为符号更有意义。
'引用方法时,它必须表示为符号。 (即:to_i而不是.to_i)这个的目的是什么?''你的意思是什么像array.map(&:to_i)? – idej
欢迎来到Stack Overflow。你想知道什么符号和它们是如何工作的,或者你想知道为什么我们在传递方法名称时使用符号?这些问题不相关,并导致一个广泛的问题。请阅读“[问]”和链接的页面。 –
它是其他符号问题的重复。只是尝试使用搜索 – idej