2012-05-16 23 views
6

Tôi hy vọng tôi không lặp lại bất kỳ ai ở đây, nhưng tôi đã tìm kiếm trên google và ở đây và không tìm ra bất kỳ thứ gì. Câu hỏi này thực sự là vấn đề "làm tình" mã của tôi.Có thể tham chiếu đến một tham số được truyền cho một phương thức trong khối được truyền trong ruby ​​không?

Dir.new('some_directory').each do |file| 
    # is there a way to refer to the string 'some_directory' via a method or variable? 
end 

Thanks:

Những gì tôi đặc biệt cố gắng để làm điều này là!

Trả lời

7

Không nói chung; nó hoàn toàn phụ thuộc vào chính phương thức mà khối được gọi với, và vào lúc each đã được gọi (gọi là khối của bạn), thực tế là chuỗi 'some_directory' được chuyển đến Dir.new đã bị lãng quên từ lâu, nghĩa là chúng khá những điều riêng biệt.

Bạn có thể làm một cái gì đó như thế này, mặc dù:

Dir.new(my_dir = 'some_directory').each do |file| 
    puts "#{my_dir} contains #{file}" 
end 
+1

Oooo, tôi thích điều đó! Tôi thậm chí không biết đó là hợp pháp. Tôi vẫn là một n00b ruby. Xin lỗi tôi không thể bỏ phiếu, tôi chưa có danh tiếng. –

+0

tức là, đây chính xác là những gì tôi đang tìm kiếm. Tôi chỉ cố gắng để cứu bản thân mình MỘT dòng mã và đây là nó :) –

+0

:)! Đó là một cách hay để làm cho mọi thứ nhỏ gọn, nhưng giống như hầu hết những điều tốt đẹp, việc sử dụng quá mức sẽ dẫn đến mã không thể đọc được, vì vậy tôi có xu hướng sử dụng nó một cách tiết kiệm hoặc có ý nghĩa gì. (Tôi nghĩ nó có ý nghĩa ở đây.) – Ashe

2

Lý do không hoạt động là neweach là hai phương pháp khác nhau để chúng không có quyền truy cập vào thông số của nhau. Để 'sexify' mã của bạn, bạn có thể xem xét việc tạo ra một phương pháp mới để chứa hai cuộc gọi phương pháp và thông qua các tham số lặp đi lặp lại đến rằng:

def do_something(dir) 
    Dir.new(dir).each do |file| 
    # use dir in some way 
    end 
end 

Thực tế là tạo ra một phương pháp mới có chi phí thấp như vậy có nghĩa là nó hoàn toàn hợp lý để tạo một cái cho một đoạn mã nhỏ như thế này - và là một trong nhiều lý do khiến Ruby trở thành niềm vui của một ngôn ngữ để làm việc cùng.

+0

mát; Tôi đã lo sợ về nó. Tôi biết tôi chỉ có thể gán 'some_directory' cho một biến nhưng tôi đã cố gắng để tiết kiệm cho mình một dòng toàn :) Cảm ơn! –

+0

Không sao cả! :-) – Russell

+0

Whoa, rõ ràng là tôi biết ở đây, nhưng khi tôi trả lời lần đầu tiên nó chỉ hiển thị dòng đầu tiên của câu trả lời của bạn. Mọi người phản ứng nhanh chóng ở đây! Cảm ơn tất cả! –

0

Chỉ cần chia nhỏ nó thành một biến. Khối Ruby đóng cửa để họ có quyền truy cập -

dir = 'some_directory' 
Dir.new(dir).each do |file| 
    # use dir here as expected. 
end 
Các vấn đề liên quan