imjacob的专栏

首页博文目录订阅
正 文

动态语言的变量赋值

(2009/11/11 21:53)

ruby中的变量赋值

4.4.1  深入分析变量赋值

给变量赋值,好像是使得变量等于赋值表达式右侧的对象:

现在,可以做puts str或其他操作,如果做的是put str,str会给出字符串"Hello",如果是其他操作,则str会做其他处理。

现在请看下面这个例子:

这个例子也是输出"Hello"。由于已经把str赋值给abc,很明显变量abc也包含了"Hello"。

下一个例子涉及一个名为replace的方法,它会用新的文本在原位置替换字符串的内容:

请仔细地观察输出:

第一个"Goodbye"是输出str的结果;第二个"Goodbye"是输出abc的结果。但是我们只替换了str。为什么abc中的字符串也被替换了呢?

答案是,Ruby中的变量(除了一些例外的情况,我们会在后面讨论)不保存对象的值。str并不包含文本"Hello",而是包含了一个到字符串对象的引用。正是这个字符串对象包含了构成"Hello"的那些字母。

当你在左侧使用变量、在右侧使用对象来执行一个赋值操作时,变量接收到对象的一个引用。当你在左侧使用变量、在右侧也使用变量来执行一个赋值操作时,左侧的变量接收到右侧的变量所引用的对象的一个引用。

下面的代码

实际上是在让str做下面这样一件事:

用"Good bye"替换你所引用的字符串对象的内容。

变量abc包含了同一个字符串对象的另一个引用。所以,尽管replace消息是发送给str的,但仍然导致了abc所引用的对象的改变。

因此,当输出abc时,我们看到的结果是:abc引用的字符串的内容已经改变了。

1.掌握引用

如果你已经在具有指针或引用或任意类似结构的语言中做过编程,那么Ruby的引用并不难理解。但是如果没有此类经验,你需要对它们进行一些思考。

Ruby中的每一个对象可以且必须有一个或多个引用指向它(如果没有引用指向它,则被认为是已死的,它的内存空间被释放和重新使用)。

如果通过对象的一个引用对它进行操作(改变它),那么改变的是对象本身。因为一个对象的所有引用都指向同一个对象,所以,通过一个引用所做的修改会在通过另一个引用检查该对象时反映出来(例如前面的例子中的str和abc)。

变量包含的是对象的引用。当变量出现在消息发送记法(即点操作符)的左侧时,一条消息就被发送到该变量包含的引用所指向的对象。如果另外的变量也包含同一个对象的引用,那么发送消息给此变量或彼变量,效果是一样的。例如,如果我们用abc.upcase!代替str.upcase!,那么结果是一样的:两个引用指向的同一个字符串被改变。

 

以上摘自《Ruby for Rails》

===============================================

python中的变量赋值

Python的赋值机制 Python中的赋值过程可以分成三步,以a = 3为例: A.创建一个对象用来表示3 B.起一个名字a(如果之前没有用过这个名字) C.将名字a与对象联系起来。 Ok,赋值完毕。 了解了这几个概念,我们可以明白,在python中一个变量并没有类型,它的类型完全取决于它所指向的对象。

赋值: python中,对象是通过引用传递的。在赋值给变量的时候,不管这个对象是新建的还是已经已经存在的,都是对该对象的引用(不是值)赋值给变量。python赋值是没有返回值的。
评 论
还没有网友评论,欢迎您第一个评论!
博 主
进入imjacob的首页
博客名称:雅克的一府
日志总数:513
评论数量:853
访问次数:1880795
建立时间:2006/11/23 20:52
导 航
公 告
Locations of visitors to this page 本博客主要用于个人学习与资料收藏。当然大家应该读了之后也能学到不少东西。其中大多数资料都是来自网络,我转载时尽可能地表明文章出处与原作者姓名,但由于很多资料经多人转载,已不清楚原作者信息与出处,所以未表明相关…
评 论
链 接

ARM+LINUX 嵌入式博客
http://blog.chinaunix.net/u1/58780/index.html

嵌入式软件
http://blog.csdn.net/embeddedsoft

诚诚恳恳做人踏踏实实编程
http://blog.sina.com.cn/u/1244756857 

和我风格相似的一个blog
http://blogger.org.cn/blog/m…