是否可以在Ruby中执行before_操作(如在Rails中)?

是否可以在Ruby中执行before_操作(如在Rails中)?,ruby,Ruby,是否可以在某个指定方法(如rails)之前调用 class Calculator before_action { raise Exception, "calculator is empty" if @numbers.nil? }, only: [:plus, :minus, :divide, :times] def push number @numbers ||= [] @numbers << number end

是否可以在某个指定方法(如rails)之前调用

class Calculator
  before_action { raise Exception, "calculator is empty" if @numbers.nil? }, 
                 only: [:plus, :minus, :divide, :times]

  def push number
    @numbers ||= [] 
    @numbers << number
  end

  def plus
    # ... 
  end

  def minus
    # ... 
  end

  def divide
    # ... 
  end

  def times
    # ... 
  end

    # ... 
end
类计算器
在_操作{引发异常,“计算器为空”if@numbers.nil?}之前,
仅限:[:加、减、除、乘]
def推送编号
@数字| |=[]

@数字您可以编写自己的逻辑,因此这是可能的。但我认为在这种情况下你不需要这么做。Ruby已经为您提供了一个处理这些问题的工具。您可以使用类“
initialize
方法,该方法在类首次初始化时调用:例如,
Calculate.new

class Calculator
  def initialize(inputs)
    raise Exception, "calculator is empty" unless inputs
  end

  # ... rest of the class
end
任何数学运算都需要输入,为什么不添加init方法呢?如果没有数字传进来,做任何数学都很难


小心将Rails控制器逻辑移植到纯Ruby。Rails控制器本身并不是典型的OOP,它们违反了很多OOP规则。Ruby更加灵活。

您需要的是对Ruby的支持。有几个宝石可以实现这一点,比如

但我认为,在您的情况下,一些延迟检查就足够了:

class Calculator
  def numbers
    raise Exception, "calculator is empty" if @numbers.nil?
    @numbers
  end

  def push number
    @numbers ||= [] 
    @numbers << number
  end

  def plus
    numbers.inject(:+) # <-- will throw the correct Exception if `@numbers` is nil
    # ... 
  end

  def minus
    # ... 
  end

  def divide
    # ... 
  end

  def times
    # ... 
  end

    # ... 
end
类计算器
def编号
如果@numbers.nil,则引发异常,“计算器为空”?
@数字
结束
def推送编号
@数字| |=[]
@数字您可以包括from
活动\u支持
并定义您需要的任何回调:

文档中的示例:

class Record
  include ActiveSupport::Callbacks
  define_callbacks :save

  def save
    run_callbacks :save do
      puts "- save"
    end
  end
end

class PersonRecord < Record
  set_callback :save, :before, :saving_message
  def saving_message
    puts "saving..."
  end

  set_callback :save, :after do |object|
    puts "saved"
  end
end

person = PersonRecord.new
person.save

# Output: 
# saving...
# - save
# saved
课堂记录
包括ActiveSupport::回调
定义_回调:保存
def保存
运行\u回调:保存do
放置“-保存”
结束
结束
结束
类PersonRecord
这可以用纯Ruby完成!一种方法是使用

但对于更一般的方法,你可以阅读

代码的示例可以是:

class Calculator

    def plus
      # ...
    end

    def end
      # ...
    end

    def divide
      # ...
    end

    def times
      # ...
    end

    [:plus, :minus, :divide, :times].each do |m|
      alias_method "original_#{m.to_s}".to_sym, m

      define_method m do
        check_numbers
        send("original_#{m.to_s}".to_sym)
      end
    end

    private

    def check_numbers
      raise Exception, "calculator is empty" if @numbers.nil? 
    end
end

当然可以,您只需要实现它:-)。如果你不介意安装Rails GEM,考虑阅读这个问题,你可以只是<代码>包括ActudieUpPult::回调< /代码>。你可以在上找到这样的例子。使用方法别名对我来说似乎有点复杂,甚至可能已经过时了。不过,我确实喜欢你在评论中发布的链接中的答案。谢谢。嗯,我认为这个答案更复杂。并且过程或多或少是相同的。如果您还需要向方法传递参数,那么如何才能做到这一点?
class Calculator

    def plus
      # ...
    end

    def end
      # ...
    end

    def divide
      # ...
    end

    def times
      # ...
    end

    [:plus, :minus, :divide, :times].each do |m|
      alias_method "original_#{m.to_s}".to_sym, m

      define_method m do
        check_numbers
        send("original_#{m.to_s}".to_sym)
      end
    end

    private

    def check_numbers
      raise Exception, "calculator is empty" if @numbers.nil? 
    end
end