您如何定义&;叫一个;变量。我的“U函数”;类中的Ruby中的方法?
因此,基本设置如下所示: 应用程序内/services/SomeService/ABC.rb您如何定义&;叫一个;变量。我的“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 =
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
是要替换的字符数。