代码之家  ›  专栏  ›  技术社区  ›  Nakilon earlonrails

一种实现“字符串分割”的方法`

  •  3
  • Nakilon earlonrails  · 技术社区  · 14 年前

    有时我需要这样的方法,它可以改变自己对象的类。有 String#delete! , #downcase! , #encode! , #gsub! , #strip! , #slice! 等等。他们都试图更改字符串,但结果类仍然是 String . 我想要一种方法,可以转换 一串 Array . 实现这一点的一些方法:

    irb(main):082:0> str = "qwerty"
    => "qwerty"
    irb(main):083:0> str.split! "e"
    => ["qw", "rty"]
    irb(main):084:0> str
    => ["qw", "rty"]
    

    有可能吗?也许是一些很酷的日本功夫或丑陋的自行车,我想看到任何解决方案。

    3 回复  |  直到 10 年前
        1
  •  11
  •   Jörg W Mittag    14 年前

    不,不可能。对象不能在Ruby中更改其类。

    例如,在Smalltalk中,您可以使用 become: :

    becomeSubStrings: aString
        self become: (self subStrings: aString).
    

    如果你这样称呼它:

    s := 'qwerty'.
    s becomeSubStrings: 'e'.
    

    现在 s 是一个数组:

    Transcript show: s printString.
    

    结果是:

    #('qw' 'rty')
    

    从技术上讲 成为: 不会更改对象的类,而是让一个对象成为另一个对象。在这种情况下,我们让 self 成为的结果 self subStrings: ,将字符串拆分为子字符串数组。结果是一样的:原来的字符串接收器现在是一个数组。

        2
  •  0
  •   Bo Jeanes    14 年前

    Jrg W Mittag的答案是可靠的。作为一种语言,Ruby的一个基本属性是不能更改对象的类。

    你能做的最好的事情就是重新分配变量,我相信你已经在这样做了:

    irb(main):082:0> str = "qwerty"
    => "qwerty"
    irb(main):083:0> str = str.split "e"
    => ["qw", "rty"]
    irb(main):084:0> str
    => ["qw", "rty"]
    
        3
  •  0
  •   Chuck    14 年前

    这只能使用 evil-ruby (至少我很确定邪恶的ruby支持这一点)。这是一种非常聪明的黑客手段,可以诱使Ruby做一些它从未想过要做的事情,但也是一种不可移植的黑客手段,众所周知,这种黑客手段会在使用Ruby的代码中造成实际的SegFault。您绝对不应该在生产代码中使用它。

    否则,为字符串指定一个内部数组,并使其将所有消息委托给该数组(沿 BlankSlate + Forwardable ).

    这仍然不是我想做的事。我无法想象这样一个小小的便利会超过实现的黑客性。

    推荐文章