小编Qua*_*tum的帖子

如何从模块访问类变量?

我想知道如何从模块中访问类变量

module Entity
  def foo
    # puts @@rules
  end
end

class Person
  include Entity

  attr_accessor :id, :name

  @@rules = [[:id, :int, :not_null],
             [:name, :string, :not_null]]
end

class Car
  include Entity

  attr_accessor :id, :year

  @@rules = [[:id, :string, :not_null],
             [:year:, :int, :not_null]]
end

p = Person.new
c = Car.new

p.foo # [[:id, :int, :not_null], [:name, :string, :not_null]]
c.foo # [[:id, :string, :not_null], [:year, :int, :not_null]]
Run Code Online (Sandbox Code Playgroud)

我看了看cattr_accessor,并mattr_accessorActiveSupport,但仍无法找到一个方法来解决这个问题.

ruby

6
推荐指数
2
解决办法
3914
查看次数

MongoDB - 具有聚合的项目数组子字段

有这个基本文件:

{
  "_id": "userID",
  "name": "User Name",
  "profiles": [
    {
      "level": 1,
      "bar": {
        "_id": "bar1ID",
        "name": "Bar Name"
      }
    },
    {
      "level": 1,
      "bar": {
        "_id": "bar2ID",
        "name": "Bar 2 Name"
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我需要删除一些字段,并重新分配bar字段,以便它只包含_id:

{
  "_id": "userID",
  "profiles": [
    {
      "level": 1,
      "bar": "bar1ID"
    },
    {
      "level": 1,
      "bar": "bar2ID"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

与UserID匹配,并使用mongo聚合框架

mongodb aggregation-framework

4
推荐指数
1
解决办法
1210
查看次数

Python中的控制台菜单生成器

正如标题所说,我正在用Python编写控制台菜单生成器.我有2个课程,菜单和项目.但是我遇到了麻烦.这是代码:

class Menu:
    def AddItem(self,item):
        class Item:
            def __init__(self,text,ToDoNext):
                self.text=text
                ??????????????
        self.item.append(Item())
    def Show():
        for i in range(len(self.item)):
            print(str(i+1)+") "+str(self.item[i])+"\n")
        print("0) Back\n")
        option=int(input())
        self.item[option].????????????
Run Code Online (Sandbox Code Playgroud)

这段代码基本上是下一步:

Main=Menu()
Menu.AddItem("Open file",ToDo1)
Menu.AddItem("Save file",ToDo2)
Menu.Show()

'''1) Open file
   2) Save file
   0) Back
   _
'''
Run Code Online (Sandbox Code Playgroud)

如果我写1并按Enter键应该执行代码部分ToDo1,例如.我认为的解决方案是下一个:

def ToDo1():
    print("Hello, world!")
Menu.AddItem("Say Hello","ToDo1()")
Run Code Online (Sandbox Code Playgroud)

并使用eval()内部的功能Show().

但我不确定这不是正确的方法.

我希望你能告诉我一个更好的方法,如果你曾经做过类似的事情(控制台菜单生成器)来共享代码并看到另一种方法.

python console eval menu generator

3
推荐指数
1
解决办法
6673
查看次数

Ruby Sequel错误,表已经存在

我意识到我无法运行教程(http://sequel.jeremyevans.net/)两次.

第一次,它按照我们的预期运行.但第二次,它引发了一个错误

SQLite3::SQLException: table `items` already exists (Sequel::DatabaseError)
Run Code Online (Sandbox Code Playgroud)

我理解错误,但我不知道如何解决它.

如何在不丢失其包含的数据的情况下打开数据库,并且仍然能够运行教程?

ruby sql sequel

2
推荐指数
1
解决办法
1719
查看次数

避免Ruby中的方法重载

由于Ruby不支持重载(由于几个微不足道的原因),我试图找到一种"模拟"它的方法.

在静态类型语言中,您不得使用instanceof(当然除了某些特定情况......)来指导应用程序.

因此,记住这一点,这是重载一个方法的正确方法,在这个方法中我关心变量的类型吗?(在这种情况下,我不关心参数的数量)

class User
  attr_reader :name, :car
end

class Car
  attr_reader :id, :model
end

class UserComposite
  attr_accessor :users

  # f could be a name, or a car id
  def filter(f)
    if (f.class == Car)
      filter_by_car(f)
    else
      filter_by_name(f)
    end
  end

  private

  def filter_by_name(name)
    # filtering by name...
  end

  def filter_by_car(car)
    # filtering by car id...
  end
end
Run Code Online (Sandbox Code Playgroud)

ruby overloading

1
推荐指数
1
解决办法
197
查看次数