Ruby on rails 如何使用define_方法编写带问号的方法
我有很多类型的用户模型(admin、normal等等)。我循环定义方法,如Ruby on rails 如何使用define_方法编写带问号的方法,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,我有很多类型的用户模型(admin、normal等等)。我循环定义方法,如admin?或normal?,如下所示: class User TYPES = %w(admin normal) User::TYPES.each do |roleVal| define_method(roleVal.to_sym) { self.role == roleVal } end end 上面的代码正在运行,例如User.first.admin,但我需要将其命名为User.first.adm
admin?
或normal?
,如下所示:
class User
TYPES = %w(admin normal)
User::TYPES.each do |roleVal|
define_method(roleVal.to_sym) { self.role == roleVal }
end
end
上面的代码正在运行,例如User.first.admin
,但我需要将其命名为User.first.admin?
带问号的语法是什么?
如果使用
define_method
无法做到这一点,那么如何在元编程中创建带有问号的方法 用define\u method
定义这种方法非常简单。传递以问号结尾的符号或字符串就足够了
define_method(:admin?) do
# code
end
你想要的是:
define_method("#{roleVal}?") { ... }
你可以做如下的事情
class User
TYPES = %w(admin normal)
User::TYPES.each do |roleVal|
define_method("#{roleVal}?") do self.role == roleVal end
end
end
希望,这将对您有所帮助。符号中的结尾问号没有什么特别之处:
class User
TYPES = %i(admin? normal?)
User::TYPES.each do |roleVal|
define_method(roleVal) { self.role == roleVal.to_s[0...-1] }
end
end
是的,有点不清楚,因为根据的文档,它使用符号作为参数。真的。但是符号也可以以
?
结尾。@。如果您查看define_method
的C代码,您将看到在名称上调用rb_to_id
,这会将字符串、固定符和符号转换为MRIid
类型。最后调用ID2SYM(id)
,它将id
值转换为一个红宝石符号(define\u methdod的返回值)。为什么在这里需要来\u sym
呢?这是一样的,而且使用会对可读性造成不良影响。。。在一行中结束
。