如何在Ruby中编写一个函数来改变主范围中变量的值

时间:2012-07-16 07:17:37

标签: ruby scope

我有一个在c中写一个值交换函数的分配,我不知道如何在ruby中做到这一点

在Ruby中像

a = 1

b = 2

value_swap!(a,b)

puts a #=> 2

puts b #=> 1

这里的困难是如何使用函数来改变主范围中的值。

4 个答案:

答案 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