2012-07-16 14 views

回答

1

Ruby字符串是可变的,所以你可以有:

a= "43" 
b= "42" 

def wtf!(a, b) 
    t= a.clone 
    a.gsub!(a, b) 
    b.gsub!(b, t) 
end 

wtf!(a, b) 

puts a, b 

不幸的是,Fixnum对象是不可变的,所以自= N将无法正常工作。

编辑:可变数据结构

的另一个例子下面是另一个可变的数据结构,该阵列。这可能会澄清我的答案。

a= [43] 
b= [42] 

def omg!(a, b) 
    b[0], a[0]= a[0], b[0] 
end 

omg!(a, b) 

p a, b 
+0

这里有一个有趣的发现http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2710 – nurettin 2012-07-16 08:30:40

+0

谢谢,作品像一个魅力。但还没有完成。 gsub使用绑定这样的东西来实现这个 – mko 2012-07-16 09:23:43

+0

gsub!修改字符串内存。像Fixnum和Float这样的类没有这个能力。这就是我所说的可变字符串。 – nurettin 2012-07-16 09:36:09

0

Ruby支持变量的平行分配其派上用场,如果你想交换值的变量像这样:

irb(main):001:0> a = 1 
=> 1 
irb(main):002:0> b = 2 
=> 2 
irb(main):003:0> a,b = b,a 
=> [1, 2] 
irb(main):004:0> a 
=> 2 
irb(main):005:0> b 
=> 1 
irb(main):006:0> 

但我想这并没有真正与分配帮助。在C中,你会根据参考将这些变量的指针传递给函数,然后对其进行处理。

如果你不能拿出一个解决方案,这里是一个尝试(不是我):

void swap(int *i, int *j) { 
    int t = *i; 
    *i = *j; 
    *j = t; 
} 

void main() { 
    int a = 23, b = 47; 
    printf("Before. a: %d, b: %d\n", a, b); 
    swap(&a, &b); 
    printf("After . a: %d, b: %d\n", a, b); 
} 
+0

感谢C代码。 – mko 2012-07-16 11:32:25

+0

'void swap_2(char a,char b){ int t; t = a; a = b; b = t; '为什么这段代码不起作用? – mko 2012-07-16 11:37:40

+1

@yozloy C中的参数总是按值传递。这意味着当你写'int a = 1,b = 2; swap_2(a,b)',你不会传递'a'和'b'到'swap_2' - 你传递它们的值,'1'和'2'。函数中的'a'和'b'与函数外的'a'和'b'无关 - 如果更改函数内部的变量,则不影响函数外部的变量。 C的解决方案称为*通过地址* - 您不传递变量的值,您将一个指针传递给它。指针是按值传递的,但由于它是一个指针,所以可以用它来改变变量。 – 2012-07-16 15:02:00

2

这是一个重大的破解,但你可以尝试这样的事:

def value_swap(a,b,parent_binding) 
    parent_binding.eval("#{a},#{b}=#{b},#{a}") 
end 

a=1 
b=2 
value_swap :a,:b,binding 
puts a 
puts b 
+0

它的工作原理,谢谢。但我想知道是否有更优雅的解决方案 – mko 2012-07-16 07:45:36

+0

除了Idan Arye所说的 - > http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc – krichard 2012-07-16 07:58:11

+0

@yozloy更优雅的解决方案是什么问题?对于交换两个基元的问题,有一个优雅的解决方案,KaiKonig已经给了你一个解决方案:'a,b = b,a'。对于编写一个函数**来交换两个变量的问题,我认为Ruby中没有一个优雅的解决方案。 – 2012-07-16 14:49:35

0

除非你使用欺骗手段,Ruby的语义不允许你允许你做什么。

你给,我只用平行分配,它采用无弄虚作假,将立即向你的代码的读者明显的例子:

a, b = b, a 
相关问题