我有一个分配新建分配FY写在C值交换功能,我不知道该怎么做,在红宝石要么如何写一个函数来改变一个变量的值范围主要在Ruby中
在Ruby中有点像
a = 1
b = 2
value_swap!(a,b)
puts a #=> 2
puts b #=> 1
这里的困难是如何使用函数来更改主范围中的值。
我有一个分配新建分配FY写在C值交换功能,我不知道该怎么做,在红宝石要么如何写一个函数来改变一个变量的值范围主要在Ruby中
在Ruby中有点像
a = 1
b = 2
value_swap!(a,b)
puts a #=> 2
puts b #=> 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
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);
}
感谢C代码。 – mko 2012-07-16 11:32:25
'void swap_2(char a,char b){ int t; t = a; a = b; b = t; '为什么这段代码不起作用? – mko 2012-07-16 11:37:40
@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
这是一个重大的破解,但你可以尝试这样的事:
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
它的工作原理,谢谢。但我想知道是否有更优雅的解决方案 – mko 2012-07-16 07:45:36
除了Idan Arye所说的 - > http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc – krichard 2012-07-16 07:58:11
@yozloy更优雅的解决方案是什么问题?对于交换两个基元的问题,有一个优雅的解决方案,KaiKonig已经给了你一个解决方案:'a,b = b,a'。对于编写一个函数**来交换两个变量的问题,我认为Ruby中没有一个优雅的解决方案。 – 2012-07-16 14:49:35
除非你使用欺骗手段,Ruby的语义不允许你允许你做什么。
你给,我只用平行分配,它采用无弄虚作假,将立即向你的代码的读者明显的例子:
a, b = b, a
这里有一个有趣的发现http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2710 – nurettin 2012-07-16 08:30:40
谢谢,作品像一个魅力。但还没有完成。 gsub使用绑定这样的东西来实现这个 – mko 2012-07-16 09:23:43
gsub!修改字符串内存。像Fixnum和Float这样的类没有这个能力。这就是我所说的可变字符串。 – nurettin 2012-07-16 09:36:09