我有一个任务要在 c 中编写一个值交换函数,我也不知道如何在 ruby 中做到这一点
在 Ruby 中类似
a = 1
b = 2
value_swap!(a,b)
puts a #=> 2
puts b #=> 1
这里的难点是如何使用函数来改变主作用域中的值。
这是一个重大的黑客攻击,但你可以尝试这样的事情:
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
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
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);
}
除非您使用诡计,否则 Ruby 的语义不会允许您尝试做的事情。
对于您给出的示例,我只使用并行分配,它不使用任何技巧,并且对您的代码的读者来说会立即显而易见:
a, b = b, a