2012-02-14 33 views
14

Tôi có một lớp tùy chỉnh và muốn ghi đè toán tử gán. Dưới đây là ví dụ:Phương pháp Setter (nhiệm vụ) với nhiều đối số

class MyArray < Array 
    attr_accessor :direction 
    def initialize 
    @direction = :forward 
    end 
end 
class History 
    def initialize 
    @strategy = MyArray.new 
    end 
    def strategy=(strategy, direction = :forward) 
    @strategy << strategy 
    @strategy.direction = direction 
    end 
end 

Điều này hiện không hoạt động như dự định. khi sử dụng

h = History.new 
h.strategy = :mystrategy, :backward 

[:mystrategy, :backward] được gán cho biến chiến lược và biến hướng vẫn :forward.
Phần quan trọng là tôi muốn có thể gán giá trị chuẩn cho tham số hướng.

Bất kỳ manh mối nào để làm cho tác phẩm này được đánh giá cao.

Trả lời

14

Do đường Cú pháp của phương pháp có đuôi =, cách duy nhất mà bạn thực sự có thể vượt qua nhiều tham số để phương pháp này là để vượt qua đường cú pháp và sử dụng send ...

h.send(:strategy=, :mystrategy, :backward) 

... trong đó trường hợp bạn cũng có thể chỉ cần sử dụng một phương pháp thông thường với những cái tên tốt hơn:

h.set_strategy :mystrategy, :backward 

Tuy nhiên, bạn có thể viết lại phương pháp của bạn để tự động bỏ mảng các giá trị nếu bạn biết rằng một mảng không bao giờ hợp pháp cho tham số:

def strategy=(value) 
    if value.is_a?(Array) 
    @strategy << value.first 
    @strategy.direction = value.last 
    else 
    @strategy = value 
    end 
end 

Điều này có vẻ như là một hack tổng thể đối với tôi, tuy nhiên. Tôi sẽ sử dụng một tên phương pháp không phải là sự xác nhận với nhiều đối số nếu bạn cần chúng.


An đề nghị thay thế: nếu các hướng dẫn chỉ là :forward:backward gì về:

def forward_strategy=(name) 
    @strategy << name 
    @strategy.direction = :forward 
end 

def reverse_strategy=(name) 
    @strategy << name 
    @strategy.direction = :backward 
end 
+0

Đã chỉnh sửa để thêm đề xuất khác để triển khai thay thế. – Phrogz

+0

Tôi thích gợi ý nơi bạn kiểm tra xem giá trị có phải là một mảng hay không. Bạn nói một hack tổng thể của nó. Trường hợp sẽ sử dụng này gây ra rắc rối? – FlyingFoX

+1

@FlyingFoX Đó là một "tổng hack" vì nó không phải là thành ngữ, không tự tài liệu, và không thường áp dụng (trong trường hợp ai đó có thể muốn vượt qua một mảng như tham số đầu tiên). – Phrogz

2

Vấn đề là

def strategy=(strategy, direction = :forward) 
    @strategy = strategy 
    @strategy.direction = direction 
end 

Khi bạn thiết lập

h.strategy = :mystrategy, :backward 

bạn đang thực sự ghi đè phiên bản gốc @strategy. Sau cuộc gọi đó, @strategy là phiên bản của Symbol, không phải .

Bạn muốn làm gì? Thay thế đối tượng hoặc cập nhật nó?

+0

Oh sry có vẻ như tôi đã sai lầm phương pháp. Nó phải là '@strategy << strategy'. – FlyingFoX

+0

Ồ; vì vậy một chiến lược không có định hướng, mà đúng hơn là bạn có một danh sách các chiến lược và hướng đi hiện tại? – Phrogz

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