Току-що реших „проблем“ в Leetcode със следния подпис:

pub fn num_islands(grid: Vec<Vec<char>>) -> i32

Когато го реших, го промених на:

pub fn num_islands(mut grid: Vec<Vec<char>>) -> i32 {

… и използвах „mut“ наистина, промених мрежата, вместо да използвам Queue или нещо подобно (надникнах в други решения, след като го реших).

Изневерявах ли? Вярвам, че не бях. И причината е, че подписът тук е много ясен: получавам собствеността на мрежата. Няма други потребители на тези данни и данните се освобождават в края на моята функция. ИМАМ СОБСТВЕНОСТ.

Следователно, според идеята за собственост, мога да го променя. Ако някой иска да не променям, те могат да ми дадат non-mut заемане на данни и тогава аз съм длъжен да запазя данните непокътнати.

Но със собствеността е по мой вкус да променям данните или не.

Това не е пост за извинения.

Това е още веднъж публикацията на страхопочитание за системата тип Rust. Експресивността му е наистина зашеметяваща. Подписът е много ясен за това какво са очакванията и какво е разрешено и тези разрешения и очаквания се спазват!

Просто сравнете това с версията на „python3“:

class Solution:
    def numIslands(self, grid: List[List[str]]) -> int:

Мога ли да променя мрежата? Има ли други потребители за grid? Може би има друга нишка, която прави същия проблем с различен алго?

Страх. Ами ако счупя нещо?
Несигурност. Има ли други потребители за данни? Какъв е договорът?
Съмнение. Може би не трябва да пипам тези данни. Трябва да внимавам.

FUD-типизиран език, предполагам. В python2 е още по-смешно, тъй като изобщо няма подпис:

class Solution(object):
    def numIslands(self, grid):
        """
        :type grid: List[List[str]]
        :rtype: int
        """