免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6564 | 回复: 13
打印 上一主题 下一主题

有段代码不理解求助! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-09 11:48 |只看该作者 |倒序浏览
  1. class Ruby
  2. def run
  3. puts "world!"
  4. end
  5. end

  6. d=Ruby.new()
  7. puts "hello #{d.run}"
复制代码
本来以为输出的结果是:
  1. hello world!
复制代码
结果是:
  1. world!
  2. hello
复制代码
为什么会是这样的?不仅顺序颠倒了,而且还换行了。

论坛徽章:
0
2 [报告]
发表于 2011-12-09 11:58 |只看该作者
  1. class A
  2. puts "world!"
  3. end
复制代码
这样的形式会直接输出world!

这是为什么

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
3 [报告]
发表于 2011-12-09 12:11 |只看该作者
puts "hello #{d.run}" 需要先构建输出的字符串,而构建它需要知道 d.run 的字符串表示,结果就被调用了。这里 d.run 不该有输出这个副作用

论坛徽章:
0
4 [报告]
发表于 2011-12-09 12:19 |只看该作者
嗯嗯嗯,楼上快手,赞一个。

论坛徽章:
0
5 [报告]
发表于 2011-12-09 12:41 |只看该作者
puts "hello #{d.run}" 需要先构建输出的字符串,而构建它需要知道 d.run 的字符串表示,结果就被调用了。这 ...
zhlong8 发表于 2011-12-09 12:11


就像进入下一层循环?,执行内部循环,然后跳出到外层?
puts "字符串" 末尾都是带有\n?

论坛徽章:
0
6 [报告]
发表于 2011-12-09 12:59 |只看该作者
回复 1# puffbaby


    改下吧:
  1. class Ruby
  2.   def run
  3.     "world!"
  4.   end
  5. end

  6. d=Ruby.new
  7. puts "hello #{d.run}"
复制代码

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
7 [报告]
发表于 2011-12-09 12:59 |只看该作者
就像进入下一层循环?,执行内部循环,然后跳出到外层?
puts "字符串" 末尾都是带有\n?
puffbaby 发表于 2011-12-09 12:41



    变量内插其实只是语法糖,puts "hello #{d.run}" 其实等于 puts("hello " + d.run.to_s)

论坛徽章:
0
8 [报告]
发表于 2011-12-09 13:09 |只看该作者
本帖最后由 puffbaby 于 2011-12-09 13:14 编辑
变量内插其实只是语法糖,puts "hello #{d.run}" 其实等于 puts("hello " + d.run.to_s)
zhlong8 发表于 2011-12-09 12:59



   看明白了。
没转过弯来,呵呵。

另外发现 似乎class里面的语句如果能执行那就直接执行了。比如
  1. class A
  2.    puts "123"
  3.   def run
  4.       puts "456"
  5.    end
  6. end
复制代码
这个就输出了 123
而456没有输出

puts "123" 直接执行,puts "456"属于实例方法,没有对象出现,也就没有调用。
其他语言
  1. class A
  2.    puts "123"
  3. end
复制代码
即使这样也不会有输出吧?感觉很奇特

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
9 [报告]
发表于 2011-12-09 13:26 |只看该作者
看明白了。
没转过弯来,呵呵。

另外发现 似乎class里面的语句如果能执行那就直接执行了。比如 ...
puffbaby 发表于 2011-12-09 13:09



    对 Ruby 这样的动态语言来讲声明一个类和创建一个匿名类然后赋值给相应的类名没什么区别,因为类也不过是普通的对象是在运行时创建的。一切都是语法糖

论坛徽章:
0
10 [报告]
发表于 2011-12-10 00:27 |只看该作者
一下子这么多讨论了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP