Perché gli argomenti per le funzioni di sottostringa non corrispondono?

2

In molte lingue, la funzione sottostringa funziona in questo modo:

sottostringa (startIndex, endIndex)

restituisce la sottostringa da startIndex fino a endIndex-1 (se si visualizza startIndex e endIndex come 0) / da startIndex + 1 a endIndex (basato su 1)

Questo è confuso. Capisco che i due parametri possono essere interpretati come "startIndex" e "lunghezza della sottostringa", ma a mio avviso è ancora confuso e anche in questo caso, startIndex è basato su 0 mentre la lunghezza è basata su 1.

Perché non attenersi a una convenzione per entrambi gli argomenti della funzione? e perché le lingue più recenti come Ruby e Python continuano ad attenersi a questo standard?

    
posta Ankit Soni 19.07.2012 - 07:59
fonte

3 risposte

8

Il secondo argomento è non la "lunghezza della sottostringa", che funziona solo se si inizia all'inizio della stringa. Il punto è che specificare "da" .. "a" è linguisticamente ambiguo: si nominano due valori limite, ma si desidera che questi due valori siano inclusi nell'intervallo estratto o no? Nel linguaggio normale, non c'è una strong preferenza convenzionale: "L'ho conosciuta dal primo al quarto grado" significa "per quattro anni", ma "l'allenamento va da uno a tre" significa "due ore", non tre.

Pertanto, sarebbe una grande fonte di confusione se gli indici facessero riferimento a caratteri in una stringa. Ciò a cui si riferiscono realmente sono le posizioni tra i caratteri : 0 significa "prima della stringa", 1 significa "dopo il primo carattere", 2 significa "dopo il secondo carattere" ecc. Quindi, s.substring(0,2) significa "I primi due personaggi di s", inequivocabilmente. (Il fatto che endIndex - startIndex == length(extract) è certamente un bel bonus.)

    
risposta data 19.07.2012 - 09:04
fonte
2

Ci sono ragioni perché Python e Ruby usano il convenzione che descrivi. Questi motivi potrebbero non essere immediatamente evidenti, ma l'esperienza e le spiegazioni ( trascritto ) da rinomati progettisti di linguaggi, ci sono buone ragioni per pensare che a base zero Gli intervalli di array semiaperti sono il meno soggetto a errori di molte opzioni possibili.

@ La risposta di KilianFoth fornisce un comune e utile mnemonico per visualizzare e utilizzare questa convenzione. Ma la ragione per cui le nuove lingue usano la convenzione è perché funziona.

    
risposta data 24.07.2012 - 00:56
fonte
1

Per le situazioni in cui [3,6] significherebbe il terzo, il quarto e il quinto carattere, ma non il sesto, suggerirei che potrebbe essere utile immaginare i personaggi come occupanti dello spazio su una linea numerica, con gli indici che rappresentano punti tra i personaggi. Il primo personaggio si sederà nello spazio tra 0 e 1, il successivo tra 1 e 2, quindi 2..3, ecc. L'intervallo [3,6] includerebbe gli spazi da 3..4, 4..5, e 5..6. Per convenzione, usando solo un singolo indice n farà riferimento all'intervallo ( n ) .. (n +1).

Visto in questo modo, diventa chiaro che [3,6] e [6,8] si riferiscono a due gamme di caratteri commoventi ma non sovrapposte, poiché occupano uno spazio commovente ma non sovrapposto sulla linea numerica.

    
risposta data 24.07.2012 - 01:34
fonte

Leggi altre domande sui tag