Project1

标题: 脚本符号对象转换 [打印本页]

作者: ppipip110    时间: 2012-4-4 20:19
标题: 脚本符号对象转换
请问在符号对象的比较中,用to_s所转换的符号和用%s{}转换的符号有什么区别吗?


‘‘──ppipip110于2012-4-4 20:19补充以下内容

在线等啊
’’dsu_plus_rewardpost_czw
作者: 第七水螰    时间: 2012-4-5 09:38
to_s 返回的是字符串而不是符號,如果你說的是 String#to_sym 或者 String#intern 的話,那默認沒有區別,因為默認情況下 Ruby 符號是不可變的數據,沒有狀態。除非你通過元編程能力做了類似這樣的 hack:

  1. s = :foo
  2. s.instance_variable_set :@a, 3

  3. p :foo.instance_variable_get :@a     # => 3
复制代码
這種 hack 才能導致 Symbol 擁有狀態,但即便如此 s 依然 == :foo。
作者: ppipip110    时间: 2012-4-5 13:32
第七水螰 发表于 2012-4-5 09:38
to_s 返回的是字符串而不是符號,如果你說的是 String#to_sym 或者 String#intern 的話,那默認沒有區別, ...

是比较啊大哥,字符串和对象不是不能比较吗?所以就要转换一下,to_s和to_sym是在字符串与符号间转换,但是据说还有个%s{}貌似可以在字符串与对象间转换,我主要是想知道这是不是真的。
作者: 第七水螰    时间: 2012-4-6 12:04
ppipip110 发表于 2012-4-5 13:32
是比较啊大哥,字符串和对象不是不能比较吗?所以就要转换一下,to_s和to_sym是在字符串与符号间转换,但 ...

抱歉,沒看清楚你前半句,只看到了語意不明的後半句。to_s 返回 String,%s 的字面值返回 Symbol,要比較 String 和 Symbol 的話,只需要將 String 轉換為 Symbol 就行了。

但是据说还有个%s{}貌似可以在字符串与对象间转换,我主要是想知道这是不是真的。


短的回答:不是。

長的回答:%s 確實是 Ruby 的語言結構。這種以百分號 + 分隔符形式表示的字面值來源於 Perl,而在 Ruby 中,%s 則是符號的字面值。然而,它並沒有「在字符串與對象間轉換」,它是在語法分析時就已經生成的常量,其間並沒有任何轉換的過程。%s{ ... } 內部的單詞是靜態數據,並非動態的 Ruby 字符串,反過來講,你也不能通過這種方式把運行時的字符串對象轉換為符號,這一點類似單引號 ' ... ' 或 %q{ ...} 的字符串字面值。
  1. @str = 'foo'

  2. puts %s{@str}     # => @str
  3. puts %s{#@str}    # => #@str
  4. puts %s{#{@str}}  # => #{@str}
复制代码
只有冒號 + 雙引號形式所表示的符號可以接受字符串內插求值:

  1. p :"#{1+1}" # => :"2"
复制代码
另外,%s 不一定非得使用 { ... } 作為分隔符。以下都是合法的符號字面值:
  1. %s[foo]
  2. %s<foo>
  3. %s(foo)
  4. %s/foo/
  5. %s\foo\
  6. %s'foo'
  7. %s"foo#{1+1}"
  8. %s?foo?
  9. %s,foo,
  10. %s.foo.
  11. %s!foo!
  12. %s@foo@
  13. %s#foo#
  14. %s$foo$
  15. %s%foo%
  16. %s^foo^
  17. %s^foo^
  18. %s|foo|
  19. %s~foo~
  20. %s`foo`
  21. %s&foo&
  22. %s*foo*
  23. %s-foo-
  24. %s_foo_
  25. %s+foo+
  26. %s=foo=
复制代码
基本上常用的特殊符號都可以用作分隔符。
作者: ppipip110    时间: 2012-4-6 12:40
很详细啊,谢了啊大哥。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1