加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby:从Array类中提取Stack的功能

发布时间:2020-12-17 04:04:45 所属栏目:百科 来源:网络整理
导读:我需要为我正在编写的程序使用类似堆栈的数据结构,并且我知道 Ruby没有显式的堆栈数据结构,但是Array类具有构成堆栈的所有属性: push,pop,size,clear,isEmpty,inspect,to_s. 在线搜索我发现使用这种语法的各种帖子将Array类的功能提取到子类中: Stack = Ar
我需要为我正在编写的程序使用类似堆栈的数据结构,并且我知道 Ruby没有显式的堆栈数据结构,但是Array类具有构成堆栈的所有属性: push,pop,size,clear,isEmpty,inspect,to_s.

在线搜索我发现使用这种语法的各种帖子将Array类的功能提取到子类中:

Stack = Array.extract([
  :push,:pop,:size,:clear,:inspect,:to_s
])

s = Stack.new
s.push 1
s.push 2
s.push 3
s       # => [1,2,3]
s.pop   # => 3
s       # => [1,2]

我想做类似的事情所以我的Array子类在它可以进行的调用中受到限制,但似乎提取方法不再在Array类API中.

问题:

>这个功能被删除是有原因的,这样的事情有什么损害?
>如何使用Ruby 1.9.3实现与此类似的功能?现在我只是将我需要的调用委托给Array类,但Array类中的所有其他方法仍然可以在我的Stack对象上调用,我不想允许.

解决方法

拿这个代码,例如:

class Stack
  def initialize
    @array = []
  end

  def push val
    @array.push val
  end

  def pop 
    @array.pop
  end
end

这里有私有实例var,您可以将所选方法委派给它.其他方法不能直接调用.语法可以变甜,并通过一些元编程更加“rubesque”,但基本思想如上所示.

当然,总是可以通过instance_variable_get到达那个私有var,你无能为力.这是Ruby!

制作干净安全的公共界面.如果有人试图干涉内在部分并打破某些东西,那就是他的问题.

更新

如果你正在使用ActiveSupport(随Rails一起提供),那么有一种更简单的方法.

# load ActiveSupport if not in Rails env
require 'active_support/core_ext'

class Stack
  def initialize
    @impl = []
  end

  # the "extract" part :)
  delegate :count,:push,to: :@impl
end

s = Stack.new
s.push(3).push(4)
s.count # => 2

或者看看@AndrewGrimm的similar answer.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读