我有一個分配新建分配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