Domanda

È che sono un principiante che sta imparando Ruby o ha davvero più modi di scrivere (le stesse) cose di Java / C #? Inoltre, se è più flessibile di Java, ci sono delle caratteristiche linguistiche di Ruby che generalmente sono non usate per evitare confusione?

Esempi potrebbero essere l'assegnazione parallela e tutti i diversi modi di scrivere stringhe, forse?

Nota: non sto chiedendo un confronto con Java / C # ... solo questa domanda sulla lingua, per favore ...

Modifica: Comprendo che C #, Java e Ruby sono fortemente tipizzati e che solo Ruby (come Python e altri) viene digitato dinamicamente (mentre Java / C # sono digitati staticamente). Alcune delle risposte affermano che i linguaggi tipizzati dinamicamente sono più flessibili. È necessariamente vero e in che modo influenza la sintassi? Chiedo solo flessibilità sintattica.

(PHP è anche digitato in modo dinamico e non sembra più flessibile di Java / C #, per quanto ho visto. Ancora una volta, intendo in termini di sintassi, non in termini di distribuzione né altri aspetti ...)

È stato utile?

Soluzione

Non conosco Java o C #, ma lascio che sia possibile ridefinire il modo in cui + funziona sui numeri che parlano da soli.

Altri suggerimenti

Per quanto mi riguarda, le funzionalità più utilizzate in Ruby e mancanti in Java sono i blocchi di codice / lambdas / chiusure.

Un'altra grande caratteristica (ma forse pericolosa) sono le classi aperte - puoi cambiare qualunque classe tu voglia - aggiungere un nuovo metodo, cambiare vecchio, ecc. Puoi persino aggiungere un metodo a un oggetto specifico, non l'intera classe:).

Un altro linguaggio dinamico che è abbastanza simile a Ruby è Python. Tuttavia, nel Zen of Python , una delle regole impone che " ; ci dovrebbe essere uno, e solo uno, un modo di fare qualcosa " ;. Questo è un opposto polare a Ruby che consente così tanto meta-programmazione che ci sono essenzialmente un numero infinito di modi per fare la stessa cosa.

Detto questo, è un po 'ironico che fino a Python 3.0 (aka: 3000) valori stringa e unicode fossero tipi diversi. Sebbene abbia senso, a volte le persone si imbattono in problemi in cui si stanno convertendo molto tra i due per eseguire operazioni di testo.

Se hai una scelta, ti consiglio quasi di usare Python come introduzione ai linguaggi dinamici. Non c'è niente di sbagliato in Ruby, ma potresti scoprire che ti imbatterai in meno situazioni in cui il "giusto" il modo di fare qualcosa non è del tutto ovvio.

In risposta alla digitazione dinamica di PHP:

Il sistema di tipi di PHP è flessibile, permettendo ai tipi di essere convertiti automaticamente in base al contesto in cui vengono utilizzati. Questo non rende in realtà tipi dinamici reali, tuttavia. Il linguaggio stesso è prevalentemente statico e non ti permetterà di aggiungere attributi agli oggetti in fase di esecuzione, ad esempio (almeno l'ultima volta che ho controllato).

Python, e molto probabilmente Ruby, sono in realtà fortemente tipizzati, il che significa che puoi fare con sicurezza confronti di tipo, e non puoi fare trucchi PHP come aggiungere stringhe numeriche per ottenere un numero. I veri linguaggi dinamici spesso consentono anche la meta-classificazione in cui è possibile regolare il tipo di un'istanza o classe o aggiungere attributi a entrambi, tutti in fase di esecuzione.

Ruby è un linguaggio dinamico. C # e Java sono entrambi linguaggi tipizzati staticamente con una digitazione forte. C # in v4.0 aggiungerà funzionalità dinamiche ma finora Java e C # hanno avuto un paradigma completamente diverso e più rigoroso rispetto ai linguaggi dinamici come Ruby e Python.

Ho commentato la risposta di rkj sopra per quanto riguarda lambda. Questo codice mostra l'esempio che hai richiesto;

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

Il primo punto da notare è che il metodo fixed_point gestisce l'idea generale di applicare progressivamente un processo ad alcuni dati fino a quando non supera un certo test. La funzione sqrt definisce il processo di ricerca di una radice quadrata e il test per determinare quando dobbiamo essere soddisfatti. Queste 'procedure' vengono quindi passate proprio come qualsiasi altra forma di dati in modo che fixed_point possa funzionare in modo magico.

Invece di archiviare temporaneamente il processo e testare tutto ciò potrebbe essere anonimo. Potremmo riscrivere sqrt come;

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

Senza questa capacità, dovrei definire sia il processo che il test come singole funzioni e creare una speciale funzione sqrt_fixed_point per chiamarli. Per quanto ne so, Java può fare qualcosa di simile usando Functors ma non so abbastanza per commentare. Il consenso che ho visto nei blog o simili è che Java lo rende così orribilmente complicato da farti venire il sangue dal naso solo provandolo.

Naturalmente, un'altra opzione offerta da Ruby è la metaprogrammazione. Potrei riscrivere sqrt in modo che riscriva (al volo) fixed_point usando il processo e il test corretti, ma questo è probabilmente un abuso della funzionalità: -)

ps. Il link JoelOnSoftware che viene pubblicato merita di essere ripetuto; http://www.joelonsoftware.com/items/2006/08/01. html

Tutti i linguaggi tipizzati dinamicamente (come Ruby) di solito sono più flessibili di quelli tipizzati staticamente (come Java). Non devi combattere con il sistema di tipi, che spesso finisci per fare in lingue tipicamente statiche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top