1

我有一个任务要在 c 中编写一个值交换函数,我也不知道如何在 ruby​​ 中做到这一点

在 Ruby 中类似

a = 1

b = 2

value_swap!(a,b)

puts a #=> 2

puts b #=> 1

这里的难点是如何使用函数来改变主作用域中的值。

4

4 回答 4

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 
于 2012-07-16T07:41:15.107 回答
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
于 2012-07-16T08:05:17.653 回答
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);
}
于 2012-07-16T07:22:04.410 回答
0

除非您使用诡计,否则 Ruby 的语义不会允许您尝试做的事情。

对于您给出的示例,我只使用并行分配,它不使用任何技巧,并且对您的代码的读者来说会立即显而易见:

a, b = b, a
于 2012-07-16T15:15:35.680 回答