2011-10-05 30 views
1

分配值,我一直没能找到关于这一主题的文档或任何参考材料:Ruby: How to write a bang method, like map?红宝石:参考资料更多地了解自我

任何人都知道的事情我可以阅读更多地了解这个具体的的事情?

编辑:在评论的光,我修正这个问题如下:

于是,我们发现,数组和字符串可以通过自我的这个数组方式来处理:

self[i]= 

但这不是操纵自我的背后的整个故事。有很多关于自我的范围和它在当前情况下的含义的参考资料,但我没有发现关于操纵方法的很多内容。

如果我想写我自己版本的Stringchomp!或其他爆炸方法怎么办?我是否使用self[0]...self[i]?其他课程呢?

谢谢!

+0

真的没有更多的东西要学。 'self'是对当前“内部”对象的引用。您可以像处理任何其他对象一样对'self'进行操作(但也可以直接访问私有和受保护的方法)。如果您想了解更多信息,Google搜索第一页上的大多数链接都非常稳固:http://www.google.com/search?q=ruby+self+object –

+1

是的,但尽管您可以访问一个由'self [0] ='指定的字符串,只会让你获得第一个字符。不幸的是,'self ='不是一个有效的操作。在这些链接中真正没有太多关于'self [0]'或类似的东西。尽管如此,我仍然会通过互联网和红宝石书籍继续跋涉。 – wulftone

+0

我在[Metaprogramming Ruby](http://shop.oreilly.com/product/9781934356470.do)中发现了它的一些引用,但仍然没有关于操作String的信息。 – wulftone

回答

1

首先阅读article in Wikipedia about self(即使它根本没有提及Ruby)。

为了使长话短说:

  • 红宝石已经借了很多概念,从其他语言,并self来自Smalltalk的。
  • self在Smalltalk中被称为伪变量,这意味着它是可变的,但它是由运行时环境设置的,而不是由程序或程序员设置的。
  • self一直引用消息的接收者。 super引用了该消息的超类,该消息由参考文献super所在的方法实现。(很高兴您没有要求super)。
  • self在Ruby中(如在Smalltalk中)一直引用当前对象,并且可能是一个类的实例,甚至是类本身。所以如果你在类方面定义了方法(只能在类中调用),那么即使有self引用了该类的对象。所以在Ruby中可能只使用self,你永远不必写下类的名字来表示接收者。重构时有一点帮助。

如果你有得到了这一切,看看Metaprogramming Ruby告诉你一些更多的花样如何使用self,类eigenclasses和其他一些有趣的事情。

+0

这是最完整的例子,但不全面。我仍然没有发现一个地方定义了_all_(真的,全部)使用ruby中的'self'的方法。 – wulftone

0

(由于这是评论...有点长)

事实上,你不能改变的self值,但是你可以在self,这是发生了什么事在你的榜样更改属性。

让我详细说明。假设你有一个类Foo和你做这样的事情:

f = Foo.new 
f.bar = 3 
puts f.bar # => 9 

2”?这里实际发生的是,您在f上调用方法bar=,参数1。方法bar=可能看起来像这样:

class Foo 
    def bar=(val) 
    @bar = val**2 # square the given value and assign it to the instance 
    end    # variable @bar 

    def bar 
    @bar   # return the instance variable @bar -- a shortcut for this is 
    end 

    # we could get rid of the second method, though, but using attr_reader: 
    attr_reader :bar 
end 

好吧,那么这是怎么回事?

f = Foo.new 
puts f[5] # => 10 

10”?!是的。再次,[]只是syntactic sugar一个普通的旧方法。事情是这样的:

class Foo 
    def [](val) 
    val * 2 # Ruby just takes the value you put between [] and gives it to you as 
    end  # the first parameter 
end 

最后:

f = Foo.new 
f[:bar] = 99 
puts f[:bar] # => 100 

没错,你猜对了,这只是另一种方法调用。例如:

class Foo 
    @my_hash = {} 

    def []=(key, val)   # Ruby gives us the value between the [] as the first 
    @my_hash[key] = val + 1 # parameter and the value after the = as the second, 
    end      # and we use them to set a value on an internal 
          # instance variable... 
    def [](key) 
    @my_hash[key]   # ...and we can use the "getter" to get a value from 
    end      # the instance variable. 
end 

你说得对,这个东西并不是全都覆盖在一个单一的,方便的来源,所以我希望这有助于。如果您需要进一步解释,欢迎发表评论。

+0

这不完全是我问的,这也是相当可疑的做法...我会不希望'f [:bar] = 99'在我下次打电话时输出100 - 另一个同样适用于其他例如,你压倒了“二传手”普遍接受的行为。我会做一个叫做'increment(key)'的函数,让它增加'@ my_hash'。所以人们不会认为你有一个好主意,并且错过了这个问题。抱歉。 – wulftone

+0

我的回答不是描述我认为任何人应该做的事情,而是像[[]'和'[] ='这样的方法如何只是普通的方法调用。它并不回答你的问题 - 正如我们在评论中所讨论的那样 - 所以我不期望得到赞成,甚至不关心你的失望,但我不赞赏你的说法,我不“有一个好主意。 “这是*插图*。你会知道更多的是写出这个确切的代码,而不是你命名一个类“Foo”,而且我认为这对任何可能会出现并阅读它的人都是显而易见的。 –