0 0

一个菜鸟问题5

irb(main):009:0> a="123"
=> "123"
irb(main):010:0> b=a
=> "123"
irb(main):011:0> b
=> "123"
irb(main):012:0> b[0]="4"
=> "4"
irb(main):013:0> b
=> "423"
irb(main):014:0> a
=> "423"
a怎么也会改变?
2008年7月25日 15:27

4个答案 按时间排序 按投票排序

0 0

b[0]="4"


这一句执行的是,将字符串"123"的第一个字符赋值为"4",

你可以试试:

       b[1]="4"
       b[2]="4"
    
       puts b   =>   "444"


2008年8月07日 16:31
0 0

如果想要不改.

把  b=a 改为

b=a.clone

2008年8月07日 12:15
0 0

irb(main):001:0> a='123'
=> "123"
irb(main):002:0> b=a
=> "123"
irb(main):003:0> a.object_id
=> 23974310
irb(main):004:0> b.object_id
=> 23974310

由此可见,b=a是将'123'的引用传递给了b,所以修改b的内容时,a的内容也会跟着修改掉了。

2008年7月28日 16:51
0 0

ruby的String对象和Java不一样,Java String对象所有public方法调用都是不可变的,而ruby String的[]方法是可变的,上面例子其实在Java里面如果调用了String的private方法(通过反射),也会有类似的结果:

	public static void main(String[] args) {
		String a = "abc";
		String b = a;
		toUpperCase(b);
		System.out.println(b);
		System.out.println(a);
	}

	public static void toUpperCase(String orig) {
		try {
			Field stringValue = String.class.getDeclaredField("value");
			stringValue.setAccessible(true);
			stringValue.set(orig, orig.toUpperCase().toCharArray());
		} catch (Exception ex) {
		}
	}

2008年7月25日 16:22

相关推荐

Global site tag (gtag.js) - Google Analytics