用户以下列形式输入数字:
1-800-432-4567
800-432-4567
800.432.4566
(800)432.4567
+1(800)-432-4567
800 432 4567
Run Code Online (Sandbox Code Playgroud)
我希望所有这些都变成一个没有特殊字符的剥离版本18004324567.数据以a的形式出现String,因此不需要进行字符串检查.
我的方法如下:
def canonical_form number
a = remove_whitespaces number #to clear all whitespaces in between
a.gsub(/[()-+.]/,'')
end
def remove_whitespaces number
number.gsub(/\s+/,'') #removes all whitespaces
end
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?可以使用canonical_form方法中的正则表达式执行空格检查而无需额外的空格方法吗?如何以更简洁的方式对其进行重构或完成?
我的理解是,这private意味着对一个实例是私有的.即使是使用显式接收器也无法调用私有方法self.要调用私有方法,我必须完成以下过程:
class Sample
def foo
baz
end
private
def baz
end
end
Sample.new.foo
Run Code Online (Sandbox Code Playgroud)
这将调用私有baz方法.有没有办法用显式接收器直接调用私有方法?
我有以下代码:
class Fish
# @message = "I can swim"
class << self
@message = "I can jump!"
define_method(:action) { @message }
end
end
Fish.action => nil
Run Code Online (Sandbox Code Playgroud)
一旦我取消注释上面的@message变量,就Fish.action返回I can swim.为什么在这两种情况下都忽略了I can jump消息.这是为什么?为什么Fish类被绑定到@message开头定义但不在singleton类内?
因此,Ruby 2.2+版本引入了符号的垃圾收集.我在irb中写了以下代码片段:
before = Symbol.all_symbols.size #=>3331
100_000.times do |i|
"sym#{i}".to_sym
end
Symbol.all_symbols.size #=> 18835
GC.start
Symbol.all_symbols.size #=>3331
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,它收集了动态生成的所有符号to_sym.
那么GC如何知道要收集哪些符号?它是否会收集符号,即使它们在程序中被引用?符号垃圾收集如何工作?如果我创建的其中一个符号在程序中被引用,它仍会收集它吗?
我使用的是Ruby 2.2.1.
为什么instance_variables方法不显示@var_one变量a?
a = Object.new
def a.my_eval; yield end
a.my_eval { @var_one = 1 }
a.instance_variables
# => []
instance_variables
# => [@var_one]
Run Code Online (Sandbox Code Playgroud) 单例方法是仅在一个实例上定义的方法.
foo = Foo.new
def foo.case
#singleton method
end
Run Code Online (Sandbox Code Playgroud)
不会instance_eval做同样的事情?为特定实例定义方法?有什么不同?
我对 Ruby 的了解是,私有方法甚至不能用显式接收者来调用self。
class Private
private
def private_method(c)
puts '#{c}'
end
end
p = Private.new
p.instance_eval{ private_method("private method called") }
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?我们可以使用 来调用私有方法instance_eval。请解释
为什么在代码a之前创建的class_eval访问权限world?
class Hello; end
a = Hello.new
Hello.class_eval {def world; puts "Hi" end}
b = Hello.new
a.world #=> "Hi"
b.world #=> "Hi"
Run Code Online (Sandbox Code Playgroud)
class_eval幕后工作如何?