如何使用 define_method 编写带问号的方法

How can I write method with question mark using define_method

我的用户模型有多种类型(管理员、普通、..)。我循环定义 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_method,如何在元编程中创建带问号的方法?

define_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