在我的Rails应用程序中,我有一个标准的用户和angular色之间的多对多关系: class User < ActiveRecord::Base has_many :user_roles has_many :roles, :through => :user_roles end 我想确保用户只能分配一次任何angular色。 任何尝试插入重复应该忽略请求,不会抛出错误或导致validation失败。 我真正想要表示的是一个“集合”,插入已经存在于集合中的元素不起作用。 {1,2,3} U {1} = {1,2,3},而不是{1,1,2,3}。 我意识到我可以这样做: user.roles << role unless user.roles.include?(role) 或者通过创build一个包装方法(例如add_to_roles(role) ),但是我希望有一些惯用的方法使它通过关联自动化,这样我可以写: user.roles << role # automatically checks roles.include? 它只是为我做的工作。 这样,我不必记得检查dups或使用自定义的方法。 在我失踪的框架中有什么东西吗? 我首先想到:has_many的uniq选项可以实现,但基本上只是“select不同”。 有没有办法做到这一点声明? 如果没有,也许通过使用关联扩展? 以下是默认行为失败的一个例子: >> u = User.create 用户创build(0.6ms)INSERT INTO“users”(“name”)VALUES(NULL) =>#<用户标识:3,名称:nil> >> u.roles << Role.first angular色负载(0.5ms)SELECT […]
在Ruby中创build哈希散列允许方便的两个(或更多)维查找。 但是,插入时必须始终检查散列中是否存在第一个索引。 例如: h = Hash.new h['x'] = Hash.new if not h.key?('x') h['x']['y'] = value_to_insert 在自动创build新哈希的情况下,最好执行以下操作: h = Hash.new h['x']['y'] = value_to_insert 同样,当查找第一个索引不存在的值时,如果返回nil,而不是接收未定义的'[]'错误的方法,则会更好。 looked_up_value = h['w']['z'] 我们可以创build一个具有这种行为的Hash包装类,但是是否存在一个用于完成此任务的Ruby成语?
什么是使用std :: rel_ops将全套关系运算符添加到类的首选方法? 这个文档build议using namespace std::rel_ops ,但是这似乎有很深的缺陷,因为这意味着包含以这种方式实现的类的头文件也会将完整的关系运算符添加到具有定义的运算符<运算符==,即使这不是所期望的。 这有可能以惊人的方式改变代码的含义。 作为一个方面说明 – 我一直在使用Boost.Operators来做到这一点,但我仍然对标准库感到好奇。
假设我有一个函数foo ,我想调用n次。 在Ruby中,我会写: n.times { foo } 在Python中,我可以写: for _ in xrange(n): foo() 但是,这似乎是一个做事的黑客办法。 我的问题:在Python中是否有这种习惯用法?
如何计算Python中两个dict对象的联合,其中(key, value)对在结果中是否存在iff key (除非有重复)? 例如, {'a' : 0, 'b' : 1}和{'c' : 2}是{'a' : 0, 'b' : 1, 'c' : 2} 。 最好你可以做到这一点,而不修改任何inputdict 。 这是有用的示例: 获取当前在范围内的所有variables的字典及其值
我发现自己对构造函数使用散列参数相当多,特别是在编写用于configuration的DSL或最终用户将要暴露的其他API位时。 我最终做的是如下所示: class Example PROPERTIES = [:name, :age] PROPERTIES.each { |p| attr_reader p } def initialize(args) PROPERTIES.each do |p| self.instance_variable_set "@#{p}", args[p] if not args[p].nil? end end end 有没有更多的地道方式来实现这一目标? 抛出常量和符号到string的转换看起来特别exception。
在Groovy中连接string的最佳(惯用)方式是什么? 选项1: calculateAccountNumber(bank, branch, checkDigit, account) { bank + branch + checkDigit + account } 选项2: calculateAccountNumber(bank, branch, checkDigit, account) { "$bank$branch$checkDigit$account" } 我已经在旧的Groovy网站上build立了一个有关这个主题的有趣的观点:你可以做的事情,但最好不要离开。 和Java一样,你可以用“+”符号连接string。 但是,Java只需要将“+”expression式中的两项中的一项作为一个string,而不pipe它是在第一位还是在最后一位。 Java将在你的“+”expression式的非String对象中使用toString()方法。 但是在Groovy中,你应该是安全的,你的“+”expression式的第一项以正确的方式实现了plus()方法,因为Groovy将会search和使用它。 在Groovy GDK中,只有Number和String / StringBuffer / Character类实现了连接string的plus()方法。 为了避免意外,请始终使用GStrings。
我有一个关于成语和可读性的问题,在这个特殊情况下似乎有一个Python哲学的冲突: 我想从字典B中build立字典A.如果在B中不存在特定的密钥,则不做任何事情并继续。 哪种方式更好? try: A["blah"] = B["blah"] except KeyError: pass 要么 if "blah" in B: A["blah"] = B["blah"] “请求宽恕”与“简单明确”。 哪个更好?为什么?
我正在寻找一个简洁的方式来检查一个值,看看它是零还是零。 目前我正在做类似的事情: if (!val || val == 0) # Is nil or zero end 但是这似乎很笨拙。
有一件事我喜欢ruby,主要是它是一个非常可读的语言(这对于自我logging代码来说是很好的) 然而,受到这个问题的启发: Ruby Code解释了和||=如何在Ruby中工作,我想到了我不使用的ruby成语,坦率地说,我没有完全理解它们。 所以我的问题是,类似于引用问题的例子,我需要注意哪些常见但不明显的ruby成语,才能成为一名真正熟练的ruby程序员? 顺便说一句,从引用的问题 a ||= b 相当于 if a == nil || a == false a = b end (感谢Ian Terrell的更正) 编辑:事实certificate,这一点不完全没有争议。 其实是正确的扩张 (a || (a = (b))) 查看这些链接为什么: http://DABlog.RubyPAL.Com/2008/3/25/a-short-circuit-edge-case/ http://DABlog.RubyPAL.Com/2008/3/26/short-circuit-post-correction/ http://ProcNew.Com/ruby-short-circuit-edge-case-response.html 感谢JörgW Mittag指出这一点。