Ruby on rails 如何使用define_方法编写带问号的方法

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等等)。我循环定义方法,如
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
,这会将字符串、固定符和符号转换为MRI
id
类型。最后调用
ID2SYM(id)
,它将
id
值转换为一个红宝石符号(define\u methdod的返回值)。为什么在这里需要
来\u sym
呢?这是一样的,而且使用
会对可读性造成不良影响。。。在一行中结束