Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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
您如何定义&;叫一个;变量。我的“U函数”;类中的Ruby中的方法?_Ruby_Class_Methods - Fatal编程技术网

您如何定义&;叫一个;变量。我的“U函数”;类中的Ruby中的方法?

您如何定义&;叫一个;变量。我的“U函数”;类中的Ruby中的方法?,ruby,class,methods,Ruby,Class,Methods,因此,基本设置如下所示: 应用程序内/services/SomeService/ABC.rb class SomeService::ABC FORBIDDEN_CHARS = {" " => "+", "'" => "%27", "/" => "%2F", ":" => "%3A", "&" => "%26"} def my_function(input) #now do something fancy with the input var =

因此,基本设置如下所示:

应用程序内/services/SomeService/ABC.rb

class SomeService::ABC 
 FORBIDDEN_CHARS = {" " => "+", "'" => "%27", "/" => "%2F", ":" => "%3A", "&" => "%26"}
 def my_function(input)
  #now do something fancy with the input
  var = .... #a String is created
  var.to_linkable
 # continue with something fancy
 end

 def to_linkable
  FORBIDDEN_CHARS.each{|key,value| self.gsub!(key,value)}
 end
end
这将导致错误:未定义“bla-bla”的“to_-linkable”方法:String

但是,通过这种方式,它可以工作:

def to_linkable(link)
    FORBIDDEN_CHARS.each{|key,value| link.gsub!(key,value)}
end
但我必须用“to_linkable(link)”来称呼它,而不是仅仅用“link.to_linkable”。如果我以第一种方式复制粘贴终端中的代码,则调用“link.to_linkable”时不会出现错误

所以我的问题是:我如何(在哪里?)正确地创建这样一个可链接的方法?我可能想稍后使用它,所以这就是为什么我希望它是一个易于使用的方法。非常感谢:)
是的,我是一个Ruby新手,来自Matlab:D

编写
类字符串。。。;结束
在另一个类中创建新类,而不是编辑现有的ruby核心
字符串
类。基本上它可以说像
String::ABC!=字符串
。因此,您应该首先定义新的String方法,如下所示:

class String
  FORBIDDEN_CHARS = {" " => "+", "'" => "%27", "/" => "%2F", ":" => "%3A", "&" => "%26"}

  def to_linkable
    FORBIDDEN_CHARS.each{ |key, value| self.gsub!(key,value) }
    self
  end      
end
之后,您可以在任何具有字符串对象的地方使用此方法。例如,在您的
SomeService
类中

class SomeService
  def my_function(input)
    #now do something fancy with the input
    var = "#{input}    " #a String is created
    var.to_linkable
    # continue with something fancy
  end
end
所以最后你可以这样做:

SomeService.new.my_function("': 123123&")
# =>"%27%3A+123123%26++++"

首先,不要重新发明轮子。使用,而不是尝试手动定义要替换的字符

但是,为了学习,如果我们按照您的实施

var
是一个字符串。如果希望对字符串调用方法,则必须在
字符串
类中定义该方法。通常不建议像这样向核心类中添加方法,但以下方法可行:

class String
  FORBIDDEN_LINK_CHARS = {" " => "+", ...}
  def to_linkable
    FORBIDDEN_LINK_CHARS.each{|key,value| self.gsub!(key,value)}
    self
  end
end

"hello world".to_linkable # => "hello+world"
或者,如果您不想扩展
String
类,但仍希望在不传递变量的情况下调用实例方法,则需要在类中的某个位置将
var
设置为实例变量。这可能是个好主意,也可能不是个好主意,这取决于班级的结构

例如,以下工作:

class SomeService::ABC 
  FORBIDDEN_CHARS = {" " => "+", ...}
  def my_function(input)
    @var = .... #a String is created
    make_var_linkable
  end

  def make_var_linkable
    FORBIDDEN_CHARS.each{|key,value| @var.gsub!(key,value)}
  end
end
…然而,回到我最初的观点,我建议的实际实现不是上述两种。只要做:

require 'uri'

class SomeService::ABC 
  def my_function(input)
    var = URI.escape(....)
  end
end

到目前为止给出的两个答案都使用了
禁止链接\u字符长度
gsub
操作的数量,这不是很理想

module StringWithForbiddenChars
  FORBIDDEN_LINK_CHARS = {" " => "+", ...}
  def to_linkable
    gsub Regexp.union(FORBIDDEN_LINK_CHARS.keys), FORBIDDEN_LINK_CHARS
  end
  def to_linkable!
    self.tap do |s|
      s.gsub! Regexp.union(FORBIDDEN_LINK_CHARS.keys), FORBIDDEN_LINK_CHARS
    end
  end
end
String.prepend StringWithForbiddenChars
# or to extend the specific instance of a string:
# (str = "hello world").extend(StringWithForbiddenChars)

"hello world".to_linkable
#⇒ "hello+world"
如果不想“污染”整个string类,可以使用模块创建特定的string实例:

module SomeService
  FORBIDDEN_CHARS = {" " => "+", "'" => "%27", "/" => "%2F", ":" => "%3A", "&" => "%26"}

  class ABC
    def my_function(input)
      # ...
      var = # a String is created
      var.extend(Linkable)
      var.to_linkable
      # ...
    end
  end

  module Linkable
    def to_linkable
      FORBIDDEN_CHARS.each { |key, value| gsub!(key,value) }
    end
  end
end

猴子打补丁哇,谢谢你这么快又有帮助的回复!扩展字符串类是有效的(URI替换字符的方式与我不同),我理解了更多的比特:-)是的,
URI.escape的行为与您的稍有不同。但这有关系吗?除非你有充分的理由不使用它(当然,这可能只是为了好玩/作为一种学习练习!),否则请始终使用“标准”解决方案:)@Ilya Ofc,给我一分钟)谢谢,接下来将深入讨论Ruby模块!我发布这篇文章的主要原因不是模块。我的代码有1次
gsub
调用,而所有其他给定应答调用
gsub
N
次,其中
N
是要替换的字符数。