Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Ruby中添加在另一个方法之后调用的方法_Ruby_Oop_Design Patterns - Fatal编程技术网

如何在Ruby中添加在另一个方法之后调用的方法

如何在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

有一个类有许多方法,都返回字符串(url)。我想添加在前面任何一个方法之后调用的新方法,这会向url添加额外的参数。例如:
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
或类似工具吗?