2010-02-15 33 views
9

Làm cách nào để tôi làm nổi bật hàm, trong ruby, chẳng hạn như sau?Ruby: Làm thế nào để thay đổi giá trị của một tham số trong một cuộc gọi hàm?

change_me! (val) 

cập nhật:

Những gì tôi đặt ra để làm được điều này:

def change_me! (val) 
    val = val.chop while val.end_with? '#' or val.end_with? '/' 
end 

này chỉ kết thúc với ....

change_me! 'test#///'  => "test#///" 
+0

Những gì bạn đang cố gắng làm các vít có phạm vi. Khi bạn gọi một hàm, bạn thay đổi phạm vi, do đó, nó sẽ không hoạt động theo cách bạn muốn. Bạn sẽ cần phải chơi với 'define_method', đó là quá mức cần thiết cho việc này. Bạn cần phải cấu trúc lại quá trình suy nghĩ của bạn. – Trevoke

+0

@Trevoke Những gì zombie cố gắng sẽ có thể với pass-by-pointer hoặc pass-by-reference. Tuy nhiên, ruby ​​không làm điều đó. Bạn có thể sửa đổi bên trong của đối tượng được truyền, nhưng không thể sửa đổi đối tượng. Nhưng bạn hoàn toàn có thể thay thế những gì được lưu trữ trong đối tượng. – hurikhan77

Trả lời

18

Bạn suy nghĩ về điều này một cách sai lầm. Mặc dù có thể làm được điều này trong Ruby, nhưng nó sẽ quá phức tạp. Cách thích hợp để thực hiện điều này sẽ là:

val.change_me! 

Điều nào, tất nhiên, khác nhau tùy thuộc vào loại bạn muốn thay đổi. Vấn đề là, theo quy ước, các phương pháp với '!' ảnh hưởng đến cá thể lớp mà chúng được gọi. Vậy ...

class Changeable 
    def initialize var 
    @var = var 
    end 

    def change_me! change=1 
    @var += change 
    end 
end 

a = Changeable.new 5 # => New object "Changeable", value 5 
a.change_me! 6 # => @var = 7 
a.change_me! # => @var = 8 

Hope this helps một chút ..

+0

Ah, xóa nó đi. Một chút của một nuuby ở đây cảm ơn. – Zombies

+3

điều này sẽ không làm việc cho tất cả các loại tham số, ví dụ mảng hoặc băm – ennuikiller

+0

ennuikiller: bạn nói đúng. Tôi chỉ muốn minh họa ý tưởng. – Trevoke

2

Những loại đối tượng là val và làm thế nào để bạn muốn thay đổi nó? Nếu bạn chỉ muốn biến một đối tượng (ví dụ, một mảng hoặc một chuỗi), những gì bạn đang yêu cầu cho các công trình trực tiếp:

def change_me!(me) 
    me << 'abides' 
end 

val = %w(the dude) 
change_me!(val) 
puts val.inspect 

val = "the dude " 
change_me!(val) 
puts val.inspect 
+0

Vì vậy, những gì tôi thực sự yêu cầu là làm thế nào để biến đổi các đối tượng. Thay vào đó, hãy viết phương pháp của riêng tôi làm biến đổi một đối tượng ... – Zombies

8

Bạn muốn làm điều này:

def change_me(val) 
    val.replace "#{val}!" 
end 

này thay thế các giá trị với một cái mới. Nhưng hãy tin tôi: Bạn thường không muốn thiết kế mã ruby ​​của bạn theo cách như vậy. Bắt đầu suy nghĩ trong các đối tượng và các lớp học. Thiết kế mã của bạn không có tác dụng phụ. Nó sẽ tiết kiệm rất nhiều rắc rối.

+0

Điều này làm tôi rùng mình và nhắc tôi về lỗi trong COBOL, nơi bạn có thể thay đổi giá trị 1 thành 2. Nó gần như là những gì OP hỏi mặc dù :) – Trevoke

+0

@Trevoke may mắn Ruby không bị ảnh hưởng bởi lỗi này, mặc dù nó sẽ là thú vị để tạo ra các công cụ như 2 + 2 = 5 ;-) – hurikhan77

+0

@ hurikhan77, đó là dễ dàng để làm: 'lớp Fixnum; bí danh: old_ +: +; def + (khác); self == 2 && other == 2?5: cũ _ + (khác); end end' –

Các vấn đề liên quan