小编mha*_*eeb的帖子

如何从ruby中删除字符串中的所有非数字?

用户以下列形式输入数字:

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方法中的正则表达式执行空格检查而无需额外的空格方法吗?如何以更简洁的方式对其进行重构或完成?

ruby

16
推荐指数
2
解决办法
6055
查看次数

如何访问私有方法

我的理解是,这private意味着对一个实例是私有的.即使是使用显式接收器也无法调用私有方法self.要调用私有方法,我必须完成以下过程:

class Sample
  def foo
    baz
  end

  private
  def baz

  end
 end 

Sample.new.foo
Run Code Online (Sandbox Code Playgroud)

这将调用私有baz方法.有没有办法用显式接收器直接调用私有方法?

ruby

14
推荐指数
2
解决办法
9031
查看次数

单例类中的实例变量

我有以下代码:

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 singleton

7
推荐指数
1
解决办法
611
查看次数

垃圾收集符号Ruby 2.2.1

因此,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.

ruby garbage-collection ruby-2.2

6
推荐指数
1
解决办法
1008
查看次数

单例类和实例变量

为什么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)

ruby eval irb

6
推荐指数
1
解决办法
872
查看次数

instance_eval和singleton方法之间的区别

单例方法是仅在一个实例上定义的方法.

foo = Foo.new
def foo.case
  #singleton method
end
Run Code Online (Sandbox Code Playgroud)

不会instance_eval做同样的事情?为特定实例定义方法?有什么不同?

ruby

5
推荐指数
1
解决办法
157
查看次数

Ruby 中的私有方法调用

我对 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。请解释

ruby

5
推荐指数
2
解决办法
1329
查看次数

在方法定义之前创建的实例

为什么在代码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幕后工作如何?

ruby

0
推荐指数
1
解决办法
39
查看次数

标签 统计

ruby ×8

eval ×1

garbage-collection ×1

irb ×1

ruby-2.2 ×1

singleton ×1