2012-07-16 15 views

回答

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 
+0

這裏有一個有趣的發現http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/2710 – nurettin 2012-07-16 08:30:40

+0

謝謝,作品像一個魅力。但還沒有完成。 gsub使用綁定這樣的東西來實現這個 – mko 2012-07-16 09:23:43

+0

gsub!修改字符串內存。像Fixnum和Float這樣的類沒有這個能力。這就是我所說的可變字符串。 – nurettin 2012-07-16 09:36:09

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); 
} 
+0

感謝C代碼。 – mko 2012-07-16 11:32:25

+0

'void swap_2(char a,char b){ int t; t = a; a = b; b = t; '爲什麼這段代碼不起作用? – mko 2012-07-16 11:37:40

+1

@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

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 
+0

它的工作原理,謝謝。但我想知道是否有更優雅的解決方案 – mko 2012-07-16 07:45:36

+0

除了Idan Arye所說的 - > http://onestepback.org/index.cgi/Tech/Ruby/RubyBindings.rdoc – krichard 2012-07-16 07:58:11

+0

@yozloy更優雅的解決方案是什麼問題?對於交換兩個基元的問題,有一個優雅的解決方案,KaiKonig已經給了你一個解決方案:'a,b = b,a'。對於編寫一個函數**來交換兩個變量的問題,我認爲Ruby中沒有一個優雅的解決方案。 – 2012-07-16 14:49:35

0

除非你使用欺騙手段,Ruby的語義不允許你允許你做什麼。

你給,我只用平行分配,它採用無弄虛作假,將立即向你的代碼的讀者明顯的例子:

a, b = b, a 
相關問題