是否可以在Ruby中执行before_操作(如在Rails中)?
是否可以在某个指定方法(如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
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