gpt4 book ai didi

ruby - ruby 中的过程和数据抽象

转载 作者:数据小太阳 更新时间:2023-10-29 07:04:37 25 4
gpt4 key购买 nike

我是 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) 数据抽象与封装有何不同

据我了解,数据抽象只是对其他类隐藏一些成员数据。

最佳答案

数据抽象是大多数面向对象语言的基础 - 其中类旨在封装数据并提供方法来控制如何修改数据(如果有的话),或提供辅助方法来获取含义的数据。

Ruby 的 Array 类是数据抽象的一个例子。它提供了一种管理对象数组的机制,并提供了可以对该数组执行的操作,而无需关心它的内部组织方式。

arr = [1,3,4,5,2,10]
p arr.class # Prints Array
p arr.sort # Prints [1,2,3,4,5,10]

过程抽象是关于向用户隐藏过程的实现细节。在上面的示例中,您真的不需要知道 sort 方法内部使用的是什么排序算法,您只需假设 Ruby Core 团队中的好人为您选择了一个最佳算法即可使用它。

同时,Ruby 可能不知道如何始终比较 Array 中存在的两个项目。例如,下面的代码将不会运行,因为 Ruby 不知道如何比较字符串和数字。

[1,3,4,5,"a","c","b", 2,10].sort 
#=> `sort': comparison of Fixnum with String failed (ArgumentError)

它允许我们 Hook 实现并帮助进行比较,即使底层排序算法保持不变(因为它是从用户那里抽象出来的)

[1,3,4,5,"a","c","b", 2,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, 3, 4, 5, 2, 10, "a", "b", "c"]

在为自己的问题编写代码时,过程抽象可用于确保过程经常将其问题分解为子问题,并使用单独的过程解决每个子问题。这允许稍后扩展某些方面(如上例,可以扩展比较 - 感谢 Ruby blocks,它更容易)。 Template method pattern是实现这一目标的好技术。

关于ruby - ruby 中的过程和数据抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32516150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com