2010-04-23 26 views
15

File welcome.rb chứa:Làm cách nào để truy cập biến được xác định trong tệp Ruby mà tôi yêu cầu trong IRB?

welcome_message = "hi there" 

Nhưng trong IRB, tôi không thể truy cập vào biến tôi vừa tạo:

require './welcome.rb' 

puts welcome_message 

# => undefined local variable or method `welcome_message' for main:Object 

cách tốt nhất để mang lại trong các biến được xác định trước là gì và có công việc khởi tạo được thực hiện khi bạn require điều gì đó vào phiên IRB của bạn? Biến toàn cầu dường như không đúng đường dẫn.

Trả lời

14

Trong khi đó là sự thật mà bạn không thể truy cập các biến địa phương được xác định trong các tập tin cần thiết, bạn có thể truy cập hằng, và bạn có thể truy cập bất cứ điều gì lưu trữ trong một đối tượng mà bạn có thể sử dụng trong cả hai tình huống. Vì vậy, có một vài cách để chia sẻ thông tin, tùy thuộc vào mục tiêu của bạn.

Giải pháp phổ biến nhất có thể là xác định mô-đun và đặt giá trị được chia sẻ của bạn trong đó. Vì các mô-đun là hằng số, bạn sẽ có thể truy cập nó trong ngữ cảnh yêu cầu.

# in welcome.rb 
module Messages 
    WELCOME = "hi there" 
end 

# in irb 
puts Messages::WELCOME # prints out "hi there" 

Bạn cũng có thể đặt giá trị bên trong một lớp, với cùng tác dụng. Ngoài ra, bạn chỉ có thể xác định nó như là một hằng số trong tập tin. Vì ngữ cảnh mặc định là một đối tượng của lớp Object, được gọi là chính, bạn cũng có thể định nghĩa một phương thức, biến cá thể hoặc biến lớp trên chính. Tất cả những cách tiếp cận này cuối cùng là những cách khác nhau để tạo ra "biến toàn cầu", ít nhiều, và có thể không tối ưu cho hầu hết các mục đích. Mặt khác, đối với các dự án nhỏ với phạm vi được xác định rất tốt, chúng có thể ổn.

# in welcome.rb 
WELCOME = "hi constant" 
@welcome = "hi instance var" 
@@welcome = "hi class var" 
def welcome 
    "hi method" 
end 


# in irb 
# These all print out what you would expect. 
puts WELCOME 
puts @welcome 
puts @@welcome 
puts welcome 
+2

Tốt, như một nhận xét: Mã 'WELCOME' trong mã John Hyland có thể được truy cập vì nó bắt đầu bằng * ký tự *, điều này làm cho nó không đổi. Ruby quan tâm. –

2

Tôi nghĩ rằng cách tốt nhất là để xác định một lớp như thế này

class Welcome 
    MESSAGE = "hi there" 
end 

sau đó trong IRB bạn có thể gọi mã của bạn như thế này:

puts Welcome::MESSAGE 
2

Đó ít nhất là nên cho phép các kinh nghiệm từ IRB :

def welcome_message; "hi there" end 
3

Bạn không thể truy cập các biến cục bộ được xác định trong tệp được bao gồm. Bạn có thể sử dụng ivars:

# in welcome.rb 
@welcome_message = 'hi there!' 

# and then, in irb: 
require 'welcome' 
puts @welcome_message 
#=>hi there! 
Các vấn đề liên quan