我是
Ruby的新手.我正在学习ruby中的抽象原理.我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节.
我关心的是如何实现它
# function to sort array # @params array[Array] to be sort def my_sort(array) return array if array.size <= 1 swapped = false while !swapped swapped = false 0.upto(array.size-2) do |i| if array[i] > array[i+1] array[i],array[i+1] = array[i+1],array[i] swapped = true end end end array end
并且这样打电话
sorted_array = my_sort([12,34,123,43,90,1])
2)数据抽象与封装有何不同
据我所知,Data Abstraction只是隐藏了其他类的一些成员数据.
解决方法
数据抽象是大多数面向对象语言的基础 – 其中类被设计为封装数据并提供控制数据如何被修改的方法(如果有的话),或者帮助方法来获得该数据的含义.
Ruby的Array类是数据抽象的一个例子.它提供了一种管理对象数组的机制,并提供了可以在该数组上执行的操作,而无需关心它内部的组织方式.
arr = [1,3,4,5,2,10] p arr.class # Prints Array p arr.sort # Prints [1,10]
程序抽象是关于从用户隐藏过程的实现细节.在上面的例子中,你真的不需要知道排序算法排序方法在内部使用什么,你只需使用它假设Ruby Core团队中的好人为你选择了最好的一个.
同时,Ruby可能不知道如何比较Array中存在的两个项目.例如,下面的代码不会运行,因为Ruby不知道如何比较字符串和数字.
[1,"a","c","b",10].sort #=> `sort': comparison of Fixnum with String Failed (ArgumentError)
它允许我们挂钩实现并帮助进行比较,即使基础排序算法保持不变(因为它是从用户中抽象出来的)
[1,10].sort { |i,j| if i.class == String and j.class == String i <=> j elsif i.class == Fixnum and j.class == Fixnum i <=> j else 0 end } #=> [1,10,"c"]
在为自己的问题编写代码时,可以使用过程抽象来确保过程经常将其问题分解为子问题,并使用单独的过程解决每个子问题.这允许某些方面稍后扩展(如上面的情况,可以扩展比较 – 由于Ruby块,它更容易). Template method pattern是实现这一目标的好方法.