-2

这个想法很简单:在/app/目录中创建类的层次结构,当然,使用它们。所以我创建了/namespace目录,在这里我有什么(请不要注意这个名字,这只是为了方便):

#app/namespace/base.rb
module Namespace
  class Base
    def initialize item
      puts 'Namespace Base'
    end
  end
end


#app/namespace/class1.rb
class Namespace::Class1 < Namespace::Base
  def initialize item
    puts 'Namespace Class1'
  end
end

#app/namespace/class2.rb
class Namespace::Class2 < Namespace::Base
  def initialize item
    puts 'Namespace Class2'
  end
end

#somewhere in a controller
a = Namespace::Class1.new

我遇到的错误是initialize: wrong number of arguments (0 for 1) (ArgumentError)Class1构造函数中引起的。

我做错了什么?

4

3 回答 3

3

这个

a = Namespace::Class1.new

尝试创建 的实例Class1,您当前没有传递任何参数。如果您查看Class1s 构造函数,它需要一个item参数。您的错误源于未传递参数。

#app/namespace/class1.rb
class Namespace::Class1 < Namespace::Base
  def initialize item   
    puts 'Namespace Class1'
  end
end

解决方案:

  1. 从构造函数中删除item参数Class1(它似乎无论如何都没有使用)
  2. 在构造对象item时传入一个值Class1
  3. item在构造函数中添加默认值

第一个似乎很理想,因为您从未item在任何课程中使用过。

于 2013-07-05T13:54:12.717 回答
1

您已将此标记为 Ruby on Rails,因此这将是特定于 Rails 的答案 - 如果这与您无关,请编辑您的问题并删除 rails ;)

确保消除 rails 'namespace' 的歧义。

在你的 'routes.rb' 中,要有一个 '/namespace' 目录,你实际上可以使用 rails 'namespace' 方法为你创建它。

namespace :namespace do
  get 'something' => 'some#action'
  put 'something' => 'some#otheraction'
end

这将创建一个要使用的 rails 路线/namespace/something

于 2013-07-05T13:58:39.497 回答
0

您还可以使用以下方法定义类构造函数Struct

class Base < Struct.new(item)
end

> Base.new.item
 => nil
> Base.new(:car).item
 => :car
  • 更容易扫描
  • 更少的代码
  • 强制简单
  • 自由二传手和吸气剂
  • 更大的灵活性(如果item未提供,则不会提高,而是设置为nil
于 2013-07-05T14:41:02.357 回答