我有一个在c中写一个值交换函数的分配,我不知道如何在ruby中做到这一点
在Ruby中像
a = 1
b = 2
value_swap!(a,b)
puts a #=> 2
puts b #=> 1
这里的困难是如何使用函数来改变主范围中的值。
答案 0 :(得分: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
答案 1 :(得分: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不可变,所以self = n不起作用。
编辑:可变数据结构的另一个例子
这是另一个可变数据结构,即数组。这可能会澄清我的答案。
a= [43]
b= [42]
def omg!(a, b)
b[0], a[0]= a[0], b[0]
end
omg!(a, b)
p a, b
答案 2 :(得分: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);
}
答案 3 :(得分:0)
Ruby的语义不会,除非你使用欺骗,否则允许你尝试做的事情。
对于您提供的示例,我只使用并行分配,它不使用任何技巧,并且会立即显示给您的代码的读者:
a, b = b, a