2009-06-29 34 views
5

Đây là một câu hỏi mới khi tôi cố gắng tự học Ruby, vì vậy xin lỗi nếu nó giống như một câu hỏi ngớ ngẩn!Ruby không thể sử dụng yêu cầu

Tôi đọc qua các ví dụ về việc tại sao là (sâu sắc) dẫn đến ruby ​​và đang trong chương 4. Tôi gõ code_words Băm vào một tập tin gọi wordlist.rb

Tôi mở tập tin khác và gõ dòng đầu tiên như require 'wordlist.rb' và phần còn lại của các mã như dưới đây

#Get evil idea and swap in code 
print "Enter your ideas " 
idea = gets 
code_words.each do |real, code| 
    idea.gsub!(real, code) 
end 

#Save the gibberish to a new file 
print "File encoded, please enter a name to save the file" 
ideas_name = gets.strip 
File::open('idea-' + ideas_name + '.txt', 'w') do |f| 
    f << idea 
end 

Khi tôi thực thi mã này, nó không thành công với thông báo lỗi sau:

C:/MyCode/MyRubyCode/filecoder. rb: 5: undefin ed biến cục bộ hoặc phương pháp 'code_words' cho chính: Object (NameError)

tôi sử dụng Windows XP và Ruby phiên bản ruby ​​1.8.6

Tôi biết tôi nên thiết lập một cái gì đó giống như một classpath, nhưng không chắc chắn nơi/làm thế nào để làm như vậy!

Rất cám ơn trước!

Trả lời

1

Tôi nghĩ rằng vấn đề có thể là yêu cầu thực thi mã trong ngữ cảnh khác, do đó biến thời gian chạy không còn khả dụng sau khi yêu cầu.

gì bạn có thể thử là làm cho nó một hằng số:

CodeWords = { :real => 'code' } 

Đó sẽ có mặt ở khắp mọi nơi.

Here là một số nền tảng trên phạm vi biến, vv

5

Trong khi cấp cao nhất của tất cả các tập tin được thực hiện trong bối cảnh tương tự, mỗi file có bối cảnh kịch bản riêng của mình cho các biến địa phương. Nói cách khác, mỗi tệp có bộ biến cục bộ riêng có thể được truy cập trong tệp đó, nhưng không phải trong các tệp khác.

Mặt khác, hằng số (CodeWords), globals ($ code_words) và phương thức (def code_words) sẽ có thể truy cập được qua các tệp.

Một số giải pháp:

CodeWords = {:real => "code"} 

$code_words = {:real => "code"} 

def code_words 
    {:real => "code"} 
end 

Một giải pháp OO mà chắc chắn là quá phức tạp đối với trường hợp này:

# first file 
class CodeWords 
    DEFAULT = {:real => "code"} 

    attr_reader :words 
    def initialize(words = nil) 
    @words = words || DEFAULT 
    end 
end 

# second file 
print "Enter your ideas " 
idea = gets 
code_words = CodeWords.new 
code_words.words.each do |real, code| 
    idea.gsub!(real, code) 
end 

#Save the gibberish to a new file 
print "File encoded, please enter a name to save the file" 
ideas_name = gets.strip 
File::open('idea-' + ideas_name + '.txt', 'w') do |f| 
    f << idea 
end 
0

Một cách đơn giản hơn sẽ được sử dụng tính năng Marshal.dump để lưu các từ mã .

# Save to File 
code_words = { 

'starmonkeys' => 'Phil và Pete, những chancellors gai của tờ New Reich, 'catapult'=> 'Chucky go-go', 'bom nổ'=> 'Heat-Assisted Living' , 'Nigeria' => "Ny và giặt khô Jerry (với Donuts)", 'Đặt kabosh trên' => 'Đặt hộp cáp vào' }

# Serialize 
f = File.open('codewords','w') 
    Marshal.dump(code_words, f) 
f.close 

Bây giờ vào đầu của bạn bạn sẽ đặt tệp này:

# Load the Serialized Data 
code_words = Marshal.load(File.open('codewords','r')) 
0

Đây là cách dễ dàng để chắc chắn rằng bạn luôn có thể bao gồm một tập tin đó là trong cùng thư mục với ứng dụng của bạn, đặt này trước khi yêu cầu tuyên bố

$:.unshift File.dirname(__FILE__) 

$: là biến toàn cầu đại diện cho "classpath"

1

Tôi vừa xem ví dụ tương tự và gặp vấn đề tương tự. Điều tôi đã làm là thay đổi tên biến trong cả hai tệp từ code_words thành $code_words.

Điều này sẽ biến nó thành biến toàn cầu và do đó có thể truy cập được bởi cả hai tệp phải không?

Câu hỏi của tôi là: đây không phải là giải pháp đơn giản hơn là làm cho nó không đổi và phải viết CodeWords = { :real => 'code' } hoặc có lý do để không làm điều đó không?

+0

Thiên Chúa của tôi đã hoạt động !! Tôi đã được trên cùng một vấn đề (cho một vài giờ bây giờ) và đã tự hỏi điều tương tự, chỉ làm cho code_words một biến toàn cầu. Để lại cho ai đó với một số ít điểm để cung cấp câu trả lời rõ ràng nhất, ngắn gọn nhất, dễ hiểu nhất. Không ai trong số này cố gắng giải mã hoặc giải thích một câu trả lời nhất định, chỉ cần sử dụng ngắn gọn, đơn giản mã ngắn gọn. Cảm ơn bạn! ... @ raed làm bạn có bất kỳ dấu hiệu cảnh báo cho mìn khác của bài tập Tại sao Poigniant? – Padawan

+0

Để làm cho nó hoạt động, tôi cũng phải thay đổi 'require' thành 'require_relative'. Đây là sự khác biệt giữa hai: http://stackoverflow.com/questions/3672586/what-is-the-difference-between-require-relative-and-require-in-ruby – Padawan

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