在Ruby中如何用子类创建方法?

时间:2013-12-16 19:27:07

标签: ruby

我想要创建的是一个允许用户输入名称的程序,该名称将在两个不同的文件中提供两条消息。第二个文件中的消息只是输入的名称。特别是我自学的方法是涉及子类的公共类方法,我在下面的程序中的尝试就是这样做。任何建议或链接将不胜感激。调试器说它是语法错误行37(最后一行)“意外的$ end,期望key_word结束”。

puts "Hello Friend. What is your name?"
  STDOUT.flush
$end

def self.get
  name
end

def self.name
  name = gets.chomp
end

File.open("testingruby.doc", 'w') do |file|
  if name != "David"
    file.puts "That's incorrect." + " " + name
  else
    file.puts "Hello " + name + "!" + " I hope you are well. Welcome to Ruby."
end

public_class_method :name
$end



class ExampleTwo < ExampleOne
 def self.get
   pizza
 end

def self.pizza
   piza = name
end

File.open("testingruby2.doc", 'w') do |file2|
   file2.puts(pizza)
end
end

2 个答案:

答案 0 :(得分:0)

您对File.open的第一次调用错过了end块:

File.open("testingruby.doc", 'w') do |file|
  if name != "David"
    file.puts "That's incorrect." + " " + name
  else
    file.puts "Hello " + name + "!" + " I hope you are well. Welcome to Ruby."
  end
end

请记住,Ruby条件必须明确地关闭。从它的外观来看,您尝试关闭File.open块而不先关闭条件,这会导致您的问题。

答案 1 :(得分:0)

正如我在对您的问题的评论中提到的那样,我浪费了相当多的时间来回复您之前的问题(这个问题的一个略微变体),在我尝试发布我的解决方案之前删除了这个问题,实际上是我脚下的地毯。我的回答的第一部分解释了代码的一些问题。那已经消失了,我没有兴趣重新创造它。我保留的第二部分是在下面。这是建议你做你想做的事情:

class ExampleOne
  def self.name
    puts "Hello Friend. What is your name?"
    your_name = gets.chomp
    if your_name != "David"
      str = "That's incorrect," + " " + your_name + "."
    else
      str = "Hello " + your_name + "!" + \
        " I hope you are well. Welcome to Ruby."
    end
    File.write("testingruby.doc", str)
    File.write("testingruby2.doc", your_name)
  end
end

我们可以通过运行它来测试它,然后读取它创建的文件的内容:

ExampleOne.name # Enter "Doug"
puts File.read("testingruby.doc")  # => That's incorrect, Doug.
puts File.read("testingruby2.doc") # => Doug

ExampleOne.name # Enter "David"
puts File.read("testingruby.doc")
  # => Hello David! I hope you are well. Welcome to Ruby.
puts File.read("testingruby2.doc") # => David

而不是File.write我可以写:

  File.open("testingruby.doc", 'w') do |file|
    file.write(str)
    file.close
  end

此处file.close是可选的;无论如何,该文件将在块的末尾关闭。同样,您可以写下:File.read而不是 File.open("testingruby.doc", 'r') do |file| puts file.read file.close end

file.close

并且,再次,{{1}}不是必需的。