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中. 问题: >这个功能被删除是有原因的,这样的事情有什么损害? 解决方法
拿这个代码,例如:
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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |