
et d'autres outils prenant en charge RBS
L'équipe de développement du langage de programmation Ruby annonce la disponibilité de la première version admissible de Ruby 3.0.0. C'est une version qui introduit un certain nombre de nouvelles fonctionnalités et améliorations de performances. Au niveau des nouvelles fonctionnalités, l'équipe de développement apporte de nouveautés pour RBS, un langage pour décrire les types de programmes Ruby. Les vérificateurs de type, y compris TypeProf et d'autres outils prenant en charge RBS, comprendront beaucoup mieux les programmes Ruby avec les définitions RBS.
Vous pouvez noter la définition des classes et des modules : les méthodes définies dans une classe, variables d'instance et leurs types, et relations d'héritage / mix-in. Le but de RBS est de prendre en charge les modèles couramment observés dans les programmes Ruby et il permet d'écrire des types avancés, y compris les types d'union, la surcharge de méthode et les génériques. Ruby 3.0 est livré avec rbsgem, qui permet d'analyser et de traiter les définitions de type écrites en RBS. Voici un petit exemple de RBS avec des définitions de classe, de module et de constante :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | module ChatApp VERSION: String class Channel attr_reader name: String attr_reader messages: Array[Message] attr_reader users: Array[User | Bot] # `|` means union types, `User` or `Bot`. def initialize: (String) -> void def post: (String, from: User | Bot) -> Message # Method overloading is supported. | (File, from: User | Bot) -> Message end end |
Voici ci-dessous une démo de TypeProf :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 | # test.rb class User def initialize(name:, age:) @name, @age = name, age end attr_reader :name, :age end User.new(name: "John", age: 20) |
Code : | Sélectionner tout |
1 2 3 4 5 6 7 | $ typeprof test.rb # Classes class User attr_reader name : String attr_reader age : Integer def initialize : (name: String, age: Integer) -> [String, Integer] end |
Une autre nouvelle fonctionnalité expérimentale est le Ractor. Il est conçu pour fournir une fonction d'exécution parallèle sans souci de sécurité des fils. Vous pouvez créer plusieurs ractors et les exécuter en parallèle. Ractor vous permet de réaliser des programmes parallèles sans risque pour les threads, car les ractors ne peuvent pas partager des objets normaux. La communication entre les ractors est prise en charge par la transmission de messages.
Pour limiter le partage d'objets, Ractor introduit plusieurs restrictions dans la syntaxe de Ruby (sans plusieurs ractors, il n'y a pas de restriction). La spécification et l'implémentation ne sont pas matures et peuvent être modifiées à l'avenir, de sorte que cette fonctionnalité est marquée comme expérimentale et affiche l'avertissement "experimental feature" lors du premier Ractor.new.
Ruby 3.0.0 RC1 introduit le "Planificateur de fibres ( Fiber Scheduler en Anglais )". Cela permet une concurrence légère sans modifier le code existant. Voici les Classes/méthodes actuellement prises en charge :
- Mutex#lock, Mutex#unlock, Mutex#sleep
- ConditionVariable#wait
- Queue#pop, SizedQueue#push
- Thread#join
- Kernel#sleep
- Process.wait
- IO#wait, IO#read, IO#write and related methods (e.g. #wait_readable, #gets, #puts and so on).
- IO#select n'est pas supporté.
Parmi les autres nouvelles fonctionnalités notables, on note que la correspondance de motifs sur une ligne est repensée (expérimental). => est ajouté. Il peut être utilisé comme une affectation à droite. Exemple :
Code : | Sélectionner tout |
1 2 3 4 5 | 0 => a p a #=> 0 {b: 0, c: 1} => {b:} p b #=> 0 |
En ce qui concerne les améliorations des performances, de nombreuses améliorations ont été mises en œuvre dans MJIT. Le collage de code long sur IRB est 53 fois plus rapide que celui fourni avec Ruby 2.7.0. Par exemple, le temps requis pour coller l'exemple de code ci-dessous passe de 11,7 secondes à 0,22 seconde, selon l'équipe de développement du langage.
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | start = Time.now def each_top_level_statement initialize_input catch(:TERM_INPUT) do loop do begin prompt unless l = lex throw :TERM_INPUT if @line == '' else @line_no += l.count("\n") next if l == "\n" @line.concat l if @code_block_open or @ltype or @continue or @indent > 0 next end end if @line != "\n" @line.force_encoding(@io.encoding) yield @line, @exp_line_no end break if @io.eof? @line = '' @exp_line_no = @line_no @indent = 0 rescue TerminateLineInput initialize_input prompt end end end end puts "Duration: #{Time.now - start} seconds" # end |
Et vous ?

Voir aussi



Vous avez lu gratuitement 3 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.