ruby中的过程和数据抽象

前端之家收集整理的这篇文章主要介绍了ruby中的过程和数据抽象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是 Ruby的新手.我正在学习ruby中的抽象原理.我理解过程抽象是隐藏用户的实现细节,或者只是专注于基本要素而忽略细节.

我关心的是如何实现它

1)这是一个简单的函数调用就像这样

# 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是实现这一目标的好方法.

原文链接:https://www.f2er.com/ruby/264662.html

猜你在找的Ruby相关文章