如何在Ruby中添加在另一个方法之后调用的方法
有一个类有许多方法,都返回字符串(url)。我想添加在前面任何一个方法之后调用的新方法,这会向url添加额外的参数。例如:如何在Ruby中添加在另一个方法之后调用的方法,ruby,oop,design-patterns,Ruby,Oop,Design Patterns,有一个类有许多方法,都返回字符串(url)。我想添加在前面任何一个方法之后调用的新方法,这会向url添加额外的参数。例如: Class.method.my\u方法 返回 www.domain.com/xxx/xxx?我的方法返回 这样做的最佳方式是什么 是否有任何来源,我可以找到类似问题的解决方案?我把它贴在这里,因为我不确定我还能在哪里找到答案。一个可能的解决方案是动态创建一个模块,并将其添加到原始类中。假设我们有这样一门课: class Origin def m1; "foo"; en
Class.method.my\u方法
返回
www.domain.com/xxx/xxx?我的方法返回
这样做的最佳方式是什么
是否有任何来源,我可以找到类似问题的解决方案?我把它贴在这里,因为我不确定我还能在哪里找到答案。一个可能的解决方案是动态创建一个模块,并将其添加到原始类中。假设我们有这样一门课:
class Origin
def m1; "foo"; end
def m2; "bar"; end
end
Origin.instance_methods(false)
#=> [
# [0] m1() Origin (unbound)
# [1] m2() Origin (unbound)
# ]
让我们定义我们的模块,遍历原始类的方法(或者我们也可以传递一个要覆盖的方法列表):
现在让我们将其前置到原始类:
Origin.prepend Appender
瞧
Origin.new.m1
#⇒ "foo?answer=42"
Origin.new.m2
#⇒ "bar?answer=42"
一种可能的解决方案是动态创建一个模块,并将其添加到原始类中。假设我们有这样一门课:
class Origin
def m1; "foo"; end
def m2; "bar"; end
end
Origin.instance_methods(false)
#=> [
# [0] m1() Origin (unbound)
# [1] m2() Origin (unbound)
# ]
让我们定义我们的模块,遍历原始类的方法(或者我们也可以传递一个要覆盖的方法列表):
现在让我们将其前置到原始类:
Origin.prepend Appender
瞧
Origin.new.m1
#⇒ "foo?answer=42"
Origin.new.m2
#⇒ "bar?answer=42"
您的符号
Class.method
表示类方法。但是你的描述听起来像是一个标准的方法Class\35; method
。为了澄清,后者相当于Class.new.method
。我想你的问题与后者有关
我认为一个标准的策略是使用一个实例变量来保存到目前为止处理过的url的信息。
这里有一个例子
class MyClass
attr_reader :url # defines the reading method "url"
def initialize(baseurl)
@url = baseurl
end
def my_method1
@url << "?" + "my_method1_return"
end
def my_method2
@url << "?" + "my_method2_return"
end
end
my_url = MyClass.new('www.domain.com/xxx/xxx')
string_url0 = my_url.url # => 'www.domain.com/xxx/xxx'
string_url1 = my_url.my_method1 # => 'www.domain.com/xxx/xxx?my_method1_return'
string_url2 = my_url.my_method2 # => 'www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
my_url.url # == string_url2 == 'www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
class-MyClass
attr_reader:url#定义读取方法“url”
def初始化(baseurl)
@url=baseurl
结束
定义我的方法1
@url“www.domain.com/xxx/xxx?我的方法1\u返回”
string_url2=my_url.my_method2#=>“www.domain.com/xxx/xxx?my_method1_return?my_method2_return”
my_url.url#==string_url2=='www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
至于一般的信息来源,我认为这个问题与OOP的一个基本设计模式有关,这是正确的。
因此,我想不出任何捷径,但程序员多年来通过课本、实际编程等学习它。你的符号
类。方法表示类方法。但是你的描述听起来像是一个标准的方法Class\35; method
。为了澄清,后者相当于Class.new.method
。我想你的问题与后者有关
我认为一个标准的策略是使用一个实例变量来保存到目前为止处理过的url的信息。
这里有一个例子
class MyClass
attr_reader :url # defines the reading method "url"
def initialize(baseurl)
@url = baseurl
end
def my_method1
@url << "?" + "my_method1_return"
end
def my_method2
@url << "?" + "my_method2_return"
end
end
my_url = MyClass.new('www.domain.com/xxx/xxx')
string_url0 = my_url.url # => 'www.domain.com/xxx/xxx'
string_url1 = my_url.my_method1 # => 'www.domain.com/xxx/xxx?my_method1_return'
string_url2 = my_url.my_method2 # => 'www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
my_url.url # == string_url2 == 'www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
class-MyClass
attr_reader:url#定义读取方法“url”
def初始化(baseurl)
@url=baseurl
结束
定义我的方法1
@url“www.domain.com/xxx/xxx?我的方法1\u返回”
string_url2=my_url.my_method2#=>“www.domain.com/xxx/xxx?my_method1_return?my_method2_return”
my_url.url#==string_url2=='www.domain.com/xxx/xxx?my_method1_return?my_method2_return'
至于一般的信息来源,我认为这个问题与OOP的一个基本设计模式有关,这是正确的。
所以,我想不出任何捷径,但程序员多年来通过学习课本、实际编程等来学习。您可以在方法末尾添加yield
语句,然后传递一个块以向url添加额外参数
比如说
class MyClass
def my_method url
# do some operation on url
yield url
end
end
然后您可以按如下方式使用它:
m = MyClass.new
m.my_method("url") do |url|
# do some operation on url
end
您可以在方法的末尾添加yield
语句,然后传递一个块以向url添加额外的参数
比如说
class MyClass
def my_method url
# do some operation on url
yield url
end
end
然后您可以按如下方式使用它:
m = MyClass.new
m.my_method("url") do |url|
# do some operation on url
end
您不能使用String#concat
或类似工具吗?您不能使用String#concat
或类似工具吗?