非常教程

Ruby 2.4参考手册

Observable

Observable

观察者模式(也称为发布/订阅)为一个对象提供了一种简单的机制,用于在状态发生变化时通知一组感兴趣的第三方对象。

机制

通知类混入Observable模块中,该模块提供了管理关联观察器对象的方法。

可观察对象必须:

  • 断言它有 #changed
  • 调用 #notify_observers

观察者使用#add_observer订阅更新,它还指定通过notify_observers调用的方法。notify_observers的默认方法是更新。

下面的例子很好地证明了这一点。一Ticker,在运行时,不断地接收股票Price为它@symbol。A Warner是价格的一般观察者,并且两个警告者被证明是a WarnLow和a WarnHigh,如果价格低于或高于他们设定的限制,它们分别发出警告。

update回调使华纳而不被显式调用运行。该系统由Ticker几名观察员组成,观察员在没有顶级代码干扰的情况下尽自己的职责。

请注意,发布者和订阅者(​​观察者和观察者)之间的合同未被声明或执行。在Ticker发布时间和价格,以及华纳接收。但如果你不确保你的合同是正确的,没有别的可以警告你。

require "observer"

class Ticker          ### Periodically fetch a stock price.
  include Observable

  def initialize(symbol)
    @symbol = symbol
  end

  def run
    last_price = nil
    loop do
      price = Price.fetch(@symbol)
      print "Current price: #{price}\n"
      if price != last_price
        changed                 # notify observers
        last_price = price
        notify_observers(Time.now, price)
      end
      sleep 1
    end
  end
end

class Price           ### A mock class to fetch a stock price (60 - 140).
  def self.fetch(symbol)
    60 + rand(80)
  end
end

class Warner          ### An abstract observer of Ticker objects.
  def initialize(ticker, limit)
    @limit = limit
    ticker.add_observer(self)
  end
end

class WarnLow < Warner
  def update(time, price)       # callback for observer
    if price < @limit
      print "--- #{time.to_s}: Price below #@limit: #{price}\n"
    end
  end
end

class WarnHigh < Warner
  def update(time, price)       # callback for observer
    if price > @limit
      print "+++ #{time.to_s}: Price above #@limit: #{price}\n"
    end
  end
end

ticker = Ticker.new("MSFT")
WarnLow.new(ticker, 80)
WarnHigh.new(ticker, 120)
ticker.run

生产:

Current price: 83
Current price: 75
--- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 75
Current price: 90
Current price: 134
+++ Sun Jun 09 00:10:25 CDT 2002: Price above 120: 134
Current price: 134
Current price: 112
Current price: 79
--- Sun Jun 09 00:10:25 CDT 2002: Price below 80: 79

公共实例方法

add_observer(observer, func=:update) Show source

observer作为观察者添加到此对象上。以便它会收到通知。

observer

将被通知更改的对象。

func

符号命名当Observable发生更改时将要调用的方法。

此方法必须返回true observer.respond_to?并且将*arg在notify_observers被调用时接收,其中*arg值是由此Observable传递给notify_observers的值

# File lib/observer.rb, line 127
def add_observer(observer, func=:update)
  @observer_peers = {} unless defined? @observer_peers
  unless observer.respond_to? func
    raise NoMethodError, "observer does not respond to `#{func}'"
  end
  @observer_peers[observer] = func
end

changed(state=true) Show source

设置此对象的更改状态。只有当改变的通知将被发送statetrue

state

布尔值,指示此Observable的状态已更改。

# File lib/observer.rb, line 168
def changed(state=true)
  @observer_state = state
end

changed?() Show source

如果自上次notify_observers调用后更改了此对象的状态,则返回true。

# File lib/observer.rb, line 176
def changed?
  if defined? @observer_state and @observer_state
    true
  else
    false
  end
end

count_observers() Show source

返回与此对象关联的观察者的数量。

# File lib/observer.rb, line 154
def count_observers
  if defined? @observer_peers
    @observer_peers.size
  else
    0
  end
end

delete_observer(observer) Show source

observer作为观察者移除此对象,以便它不再接收通知。

observer

这个Observable的观察者

# File lib/observer.rb, line 140
def delete_observer(observer)
  @observer_peers.delete observer if defined? @observer_peers
end

delete_observers() Show source

删除与此对象关联的所有观察者。

# File lib/observer.rb, line 147
def delete_observers
  @observer_peers.clear if defined? @observer_peers
end

notify_observers(*arg) Show source

如果该对象的状态改变,通知观察者状态改变true

这将调用add_observer中传递的方法*arg。然后将更改的状态设置为false

*arg

任何传递给观察者的参数。

# File lib/observer.rb, line 192
def notify_observers(*arg)
  if defined? @observer_state and @observer_state
    if defined? @observer_peers
      @observer_peers.each do |k, v|
        k.send v, *arg
      end
    end
    @observer_state = false
  end
end
Observable
Ruby 2.4

Ruby 是一种面向对象、命令式、函数式、动态的通用编程语言,是世界上最优美而巧妙的语言。

主页 https://www.ruby-lang.org/
源码 https://github.com/ruby/ruby
版本 2.4
发布版本 2.4.1

Ruby 2.4目录

1.缩略 | Abbrev
2.ARGF
3.数组 | Array
4.Base64
5.基本对象 | BasicObject
6.基准测试 | Benchmark
7.BigDecimal
8.绑定 | Binding
9.CGI
10.类 | Class
11.比较 | Comparable
12.负责 | Complex
13.计算续体 | Continuation
14.覆盖 | Coverage
15.CSV
16.日期 | Date
17.日期时间 | DateTime
18.DBM
19.代理 | Delegator
20.摘要 | Digest
21.Dir
22.DRb
23.编码 | Encoding
24.枚举 | Enumerable
25.枚举 | Enumerator
26.ENV
27.ERB
28.错误 | Errors
29.Etc
30.期望值 | Exception
31.错误类 | FalseClass
32.Fiber
33.Fiddle
34.文件 | File
35.文件实用程序 | FileUtils
36.查找 | Find
37.浮点 | Float
38.Forwardable
39.GC
40.GDBM
41.GetoptLong
42.Hash
43.Integer
44.IO
45.IPAddr
46.JSON
47.Kernel
48.语言 | 3Language
49.记录 | Logger
50.编排 | Marshal
51.MatchData
52.数学 | Math
53.矩阵 | Matrix
54.方法 | Method
55.模型 | Module
56.监控 | Monitor
57. 互斥 | Mutex
58.Net
59.Net::FTP
60.Net::HTTP
61.Net::IMAP
62.Net::SMTP
63.NilClass
64.数字 | Numeric
65.对象 | Object
66.ObjectSpace
67.Observable
68.Open3
69.OpenSSL
70.OpenStruct
71.OpenURI
72.OptionParser
73.路径名 | Pathname
74.完整输出 | PrettyPrint
75.Prime
76.Proc
77.过程 | Process
78.PStore
79.PTY
80.队列 | Queue
81.随机 | Random
82.范围 | Range
83.合理的 | Rational
84.Readline
85.Regexp
86.Resolv
87.Ripper
88.RubyVM
89.Scanf
90.SDBM
91.SecureRandom
92.Set
93.Shell
94.信号 | Signal
95.Singleton
96.套接字 | Socket
97.字符串 | String
98.StringIO
99.StringScanner
100.结构 | Struct