设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1874|回复: 4
打印 上一主题 下一主题

[已经解决] 脚本符号对象转换

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
43 小时
注册时间
2011-10-1
帖子
29
跳转到指定楼层
1
发表于 2012-4-4 20:19:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请问在符号对象的比较中,用to_s所转换的符号和用%s{}转换的符号有什么区别吗?


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

在线等啊
’’
R

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
2
发表于 2012-4-5 09:38:01 | 只看该作者
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。

点评

另外就是 to_sym 是運行時動態生成符號(如果調用的時候符號表中還沒有這個符號的話),而 %s 是字面值,在語法分析時就靜態生成了。  发表于 2012-4-5 09:45
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
43 小时
注册时间
2011-10-1
帖子
29
3
 楼主| 发表于 2012-4-5 13:32:01 | 只看该作者
第七水螰 发表于 2012-4-5 09:38
to_s 返回的是字符串而不是符號,如果你說的是 String#to_sym 或者 String#intern 的話,那默認沒有區別, ...

是比较啊大哥,字符串和对象不是不能比较吗?所以就要转换一下,to_s和to_sym是在字符串与符号间转换,但是据说还有个%s{}貌似可以在字符串与对象间转换,我主要是想知道这是不是真的。
R
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
163 小时
注册时间
2011-11-12
帖子
56
4
发表于 2012-4-6 12:04:07 | 只看该作者
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=
复制代码
基本上常用的特殊符號都可以用作分隔符。

点评

感谢 学习到了  发表于 2012-4-6 12:47

评分

参与人数 2星屑 +340 收起 理由
iisnow + 170 同学习到了=。=
orzfly + 170

查看全部评分

回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
43 小时
注册时间
2011-10-1
帖子
29
5
 楼主| 发表于 2012-4-6 12:40:57 | 只看该作者
很详细啊,谢了啊大哥。
R
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-29 22:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表