<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Ruby</title>
		<link>https://www.developpez.net/forums/</link>
		<description>Le forum sur la programmation Ruby. Voir aussi la FAQ Ruby et les cours Ruby.</description>
		<language>fr</language>
		<lastBuildDate>Mon, 01 Jun 2026 06:24:28 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.png</url>
			<title>Forum du club des développeurs et IT Pro - Ruby</title>
			<link>https://www.developpez.net/forums/</link>
		</image>
		<item>
			<title>La version 4.0.0 du langage de programmation Ruby est sortie</title>
			<link>https://www.developpez.net/forums/showthread.php?t=2181168&amp;goto=newpost</link>
			<pubDate>Fri, 26 Dec 2025 14:08:08 GMT</pubDate>
			<description>*La version 4.0.0 du langage...</description>
			<content:encoded><![CDATA[<div><b><font size="4">La version 4.0.0 du langage de programmation Ruby est sortie, introduisant « Ruby Box », une nouvelle fonctionnalité qui permet de séparer les définitions, et « ZJIT », un nouveau compilateur JIT</font></b><br />
<br />
<b>La version 4.0.0 de Ruby est sortie et introduit « Ruby Box » et « ZJIT ». Ruby Box est une nouvelle fonctionnalité (expérimentale) qui permet de séparer les définitions. ZJIT est un nouveau compilateur juste-à-temps (JIT), développé comme la prochaine génération de YJIT. Ractor, le mécanisme d'exécution parallèle de Ruby, a bénéficié de plusieurs améliorations. En termes de performances, de nombreuses structures de données internes ont été améliorées afin de réduire considérablement les conflits sur un verrou global, ce qui permet un meilleur parallélisme.</b><br />
<br />
Ruby est un langage de programmation polyvalent. Il a été conçu dans un souci de productivité et de simplicité. En Ruby, tout est un objet, y compris les types de données primitifs. Il a été développé au milieu des années 1990 par Yukihiro « Matz » Matsumoto au Japon. Ruby est un langage interprété, de haut niveau et à typage dynamique ; son interpréteur utilise le ramasse-miettes et la compilation juste à temps (JIT). Il prend en charge plusieurs paradigmes de programmation, notamment la programmation procédurale, orientée objet et fonctionnelle. Selon son créateur, Ruby a été influencé par Perl, Smalltalk, Eiffel, Ada, BASIC et Lisp. <br />
<br />
La version 4.0.0 de Ruby est sortie et introduit « Ruby Box » et « ZJIT ». Ruby Box est une nouvelle fonctionnalité (expérimentale) qui permet de séparer les définitions. ZJIT est un nouveau compilateur juste-à-temps (JIT), développé comme la prochaine génération de YJIT. ZJIT est plus rapide que l'interpréteur, mais pas encore aussi rapide que YJIT. Cette version apporte également des mises à jour des classes principales.<br />
<br />
Ractor, le mécanisme d'exécution parallèle de Ruby, a bénéficié de plusieurs améliorations. En termes de performances, de nombreuses structures de données internes ont été améliorées afin de réduire considérablement les conflits sur un verrou global, ce qui permet un meilleur parallélisme. Les Ractors partagent désormais moins de données internes, ce qui réduit les conflits de cache CPU lors de l'exécution en parallèle.<br />
<br />
<div style="text-align: center;">
<div class="video-container"><iframe class="restrain" title="YouTube video player" width="560" height="315" allowfullscreen src="//www.youtube.com/embed/UYm0kfnRTJk?wmode=transparent&amp;fs=1" frameborder="0"></iframe></div>
</div><br />
<b><font size="3">Ruby Box</font></b><br />
<br />
Ruby Box est une nouvelle fonctionnalité (expérimentale) qui permet de séparer les définitions. Ruby Box est activée lorsque la variable d'environnement <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">RUBY_BOX=<span style="color: #cc66cc;">1</span></span> est spécifiée. La classe est <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ruby::Box</span>.<br />
<br />
Les définitions chargées dans une boîte sont isolées dans celle-ci. Ruby Box peut isoler/séparer les monkey patches, les modifications des variables globales/de classe, les définitions de classe/module et les bibliothèques natives/ruby chargées des autres boîtes.<br />
<br />
Les cas d'utilisation prévus sont les suivants :<br />
<br />
- Exécuter des cas de test dans une boîte pour protéger les autres tests lorsque le cas de test utilise des monkey patches pour remplacer quelque chose<br />
<br />
- Exécuter des boîtes d'applications web en parallèle pour effectuer un déploiement bleu-vert sur un serveur d'applications dans un processus Ruby<br />
<br />
- Exécuter des boîtes d'applications web en parallèle pour évaluer les mises à jour de dépendances pendant une certaine période en vérifiant les différences de réponse à l'aide du code Ruby.<br />
<br />
- Utiliser comme API de base (bas niveau) pour implémenter une sorte d'API « package » (haut niveau) (elle n'est pas encore conçue).<br />
<br />
<br />
<b><font size="3">ZJIT</font></b><br />
<br />
ZJIT est un nouveau compilateur juste-à-temps (JIT), développé comme la prochaine génération de YJIT. Vous avez besoin de Rust 1.85.0 ou d'une version plus récente pour compiler Ruby avec le support ZJIT, et ZJIT est activé lorsque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">--</span>zjit</span> est spécifié.<br />
<br />
L'équipe développe un nouveau compilateur pour Ruby afin d'augmenter les performances maximales (taille d'unité de compilation plus importante et SSA IR) et d'encourager davantage de contributions externes (en devenant un compilateur plus traditionnel). <br />
<br />
ZJIT est plus rapide que l'interpréteur, mais pas encore aussi rapide que YJIT. Les développeurs sont encouragés à tester ZJIT, mais il n'est pas recommandé de ne pas le déployer en production pour le moment. <br />
<br />
<br />
<b><font size="3">Améliorations de Ractor</font></b><br />
<br />
Ractor, le mécanisme d'exécution parallèle de Ruby, a bénéficié de plusieurs améliorations. Une nouvelle classe, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port</span>, a été introduite pour résoudre les problèmes liés à l'envoi et à la réception de messages. De plus, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0080ff;">shareable_proc</span></span> facilite le partage d'objets <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Proc</span></span> entre les Ractors.<br />
<br />
En termes de performances, de nombreuses structures de données internes ont été améliorées afin de réduire considérablement les conflits sur un verrou global, ce qui permet un meilleur parallélisme. Les Ractors partagent désormais moins de données internes, ce qui réduit les conflits de cache CPU lors de l'exécution en parallèle.<br />
<br />
Ractor a été introduit pour la première fois dans Ruby 3.0 en tant que fonctionnalité expérimentale, l'objectif est de supprimer son statut « expérimental » l'année prochaine.<br />
<br />
<br />
<b><font size="3">Modifications du langage</font></b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">*</span><span style="color: #0080ff;">nil</span></span> n'appelle plus <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">nil</span>.<span style="color: #0080ff;">to_a</span></span>, de la même manière que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">**</span><span style="color: #0080ff;">nil</span></span> n'appelle pas <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">nil</span>.<span style="color: #0080ff;">to_hash</span></span>.<br />
<br />
- Les opérateurs binaires logiques (<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">||</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">&amp;&amp;</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">and</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">or</span></span>) au début d'une ligne continuent la ligne précédente, comme le point fluide. Les exemples de code suivants sont équivalents :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">if</span> condition1
     <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> condition2
    ...
  <span style="color: #0000ff;">end</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
Auparavant :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">if</span> condition1 <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> condition2
    ...
  <span style="color: #0000ff;">end</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">if</span> condition1 <span style="color:#006600; font-weight:bold;">&amp;&amp;</span>
     condition2
    ...
  <span style="color: #0000ff;">end</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<b><font size="3">Mises à jour des classes principales</font></b><br />
<br />
<b>Array</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Array</span><span style="color: #808080;">#rfind</span></span> a été ajouté comme alternative plus efficace à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">array</span>.<span style="color: #0080ff;">reverse_each</span>.<span style="color: #0080ff;">find</span></span>.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Array</span><span style="color: #808080;">#find</span></span> a été ajouté comme remplacement plus efficace de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Enumerable<span style="color: #808080;">#find</span></span>.<br />
<br />
<b>Binding</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#local_variables</span></span> n'inclut plus de paramètres numérotés. De plus, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#local_variable_get</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#local_variable_set</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#local_variable_defined?</span></span> refusent de traiter les paramètres numérotés.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#implicit_parameters</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#implicit_parameter_get</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Binding</span><span style="color: #808080;">#implicit_parameter_defined?</span></span> ont été ajoutés pour accéder aux paramètres numérotés et au paramètre « it ».<br />
<br />
<b>Enumerator</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Enumerator.<span style="color: #0080ff;">produce</span></span> accepte désormais un argument clé facultatif <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">size</span> pour spécifier la taille de l'énumérateur. Il peut s'agir d'un entier, de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Float</span>::INFINITY</span>, d'un objet appelable (tel qu'un lambda) ou de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0080ff;">nil</span></span> pour indiquer une taille inconnue. Si elle n'est pas spécifiée, la taille par défaut est <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Float</span>::INFINITY</span>.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #808080;"># Infinite enumerator</span>
  enum = Enumerator.<span style="color: #0080ff;">produce</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">1</span>, size: <span style="color: #0000ff;">Float</span>::INFINITY, <span style="color:#006600; font-weight:bold;">&amp;</span>:succ<span style="color:#006600; font-weight:bold;">&#41;</span>
  enum.<span style="color: #0080ff;">size</span>  <span style="color: #808080;"># =&gt; Float::INFINITY</span>
&nbsp;
  <span style="color: #808080;"># Finite enumerator with known/computable size</span>
  abs_dir = File.<span style="color: #0080ff;">expand_path</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #FF0000;">&quot;./baz&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color: #808080;"># =&gt; &quot;/foo/bar/baz&quot;</span>
  traverser = Enumerator.<span style="color: #0080ff;">produce</span><span style="color:#006600; font-weight:bold;">&#40;</span>abs_dir, size: <span style="color:#006600; font-weight:bold;">-&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> abs_dir.<span style="color: #0080ff;">count</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #FF0000;">&quot;/&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color: #cc66cc;">1</span> <span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
    <span style="color: #0000ff;">raise</span> StopIteration <span style="color: #0000ff;">if</span> it == <span style="color: #FF0000;">&quot;/&quot;</span>
    File.<span style="color: #0080ff;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span>it<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">&#125;</span>
  traverser.<span style="color: #0080ff;">size</span>  <span style="color: #808080;"># =&gt; 4</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<b>ErrorHighlight</b><br />
<br />
Lorsqu'une erreur ArgumentError est levée, elle affiche désormais des extraits de code pour l'appel de méthode (appelant) et la définition de méthode (appelé).<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="26"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">test</span>.<span style="color: #0080ff;">rb</span>:<span style="color: #cc66cc;">1</span>:<span style="color: #0000ff;">in</span> <span style="color: #FF0000;">'Object#add'</span>: wrong number of arguments <span style="color:#006600; font-weight:bold;">&#40;</span>given <span style="color: #cc66cc;">1</span>, expected <span style="color: #cc66cc;">2</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#40;</span>ArgumentError<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">caller</span>: <span style="color: #0000ff;">test</span>.<span style="color: #0080ff;">rb</span>:<span style="color: #cc66cc;">3</span>
    <span style="color:#006600; font-weight:bold;">|</span> add<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      ^^^
    callee: <span style="color: #0000ff;">test</span>.<span style="color: #0080ff;">rb</span>:<span style="color: #cc66cc;">1</span>
    <span style="color:#006600; font-weight:bold;">|</span> <span style="color: #0000ff;">def</span> add<span style="color:#006600; font-weight:bold;">&#40;</span>x, y<span style="color:#006600; font-weight:bold;">&#41;</span> = x <span style="color:#006600; font-weight:bold;">+</span> y
          ^^^
        from <span style="color: #0000ff;">test</span>.<span style="color: #0080ff;">rb</span>:<span style="color: #cc66cc;">3</span>:<span style="color: #0000ff;">in</span> <span style="color: #FF0000;">'&lt;main&gt;'</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<b>Fiber</b><br />
<br />
Introduction de la prise en charge de l'argument <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Fiber<span style="color: #808080;">#raise(cause:)</span></span> similaire à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Kernel<span style="color: #808080;">#raise</span></span>.<br />
<br />
<b>Fiber::Scheduler</b><br />
<br />
- Introduction de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Fiber::Scheduler<span style="color: #808080;">#fiber_interrupt</span></span> pour interrompre une fibre avec une exception donnée. Le cas d'utilisation initial consiste à interrompre une fibre qui attend une opération d'E/S bloquante lorsque l'opération d'E/S est fermée.<br />
<br />
- Introduction de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Fiber::Scheduler<span style="color: #808080;">#yield</span></span> pour permettre au planificateur de fibres de continuer le traitement lorsque les exceptions de signal sont désactivées.<br />
<br />
- Réintroduction du hook <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Fiber::Scheduler<span style="color: #808080;">#io_close</span></span> pour <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IO<span style="color: #808080;">#close</span></span> asynchrone.<br />
<br />
- Appel de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Fiber::Scheduler<span style="color: #808080;">#io_write</span></span> lors du vidage du tampon d'écriture IO.<br />
<br />
<b>File</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">File::Stat<span style="color: #808080;">#birthtime</span></span> est désormais disponible sous Linux via l'appel système statx lorsqu'il est pris en charge par le noyau et le système de fichiers.<br />
<br />
<b>IO</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IO.<span style="color: #0000ff;">select</span></span> accepte <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Float</span>::INFINITY</span> comme argument de délai d'expiration.<br />
<br />
- Un comportement obsolète, la création de processus par les méthodes de classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IO</span> avec un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">|</span></span> en tête, a été supprimé.<br />
<br />
<b>Kernel</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Kernel<span style="color: #808080;">#inspect</span></span> vérifie désormais l'existence d'une méthode <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #808080;">#instance_variables_to_inspect</span></span>, ce qui permet de contrôler les variables d'instance affichées dans la chaîne <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #808080;">#inspect</span></span> :<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td valign="top"><pre style="margin: 0">  <span style="color: #0000ff;">class</span> DatabaseConfig
    <span style="color: #0000ff;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>host, user, password<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#006600; font-weight:bold;">@</span>host = host
      <span style="color:#006600; font-weight:bold;">@</span>user = user
      <span style="color:#006600; font-weight:bold;">@</span>password = password
    <span style="color: #0000ff;">end</span>
&nbsp;
    private <span style="color: #0000ff;">def</span> instance_variables_to_inspect = <span style="color:#006600; font-weight:bold;">&#91;</span>:<span style="color:#006600; font-weight:bold;">@</span>host, :<span style="color:#006600; font-weight:bold;">@</span>user<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color: #0000ff;">end</span>
&nbsp;
  conf = DatabaseConfig.<span style="color: #0080ff;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color: #FF0000;">&quot;localhost&quot;</span>, <span style="color: #FF0000;">&quot;root&quot;</span>, <span style="color: #FF0000;">&quot;hunter2&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  conf.<span style="color: #0080ff;">inspect</span> <span style="color: #808080;">#=&gt; #&lt;DatabaseConfig:0x0000000104def350 @host=&quot;localhost&quot;, @user=&quot;root&quot;&gt;</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
- Un comportement obsolète, la création de processus par <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Kernel<span style="color: #808080;">#open</span></span> avec un <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">|</span></span> en tête, a été supprimé.<br />
<br />
<b>Math</b><br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Math.<span style="color: #0080ff;">log1p</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Math.<span style="color: #0080ff;">expm1</span></span> ont été ajoutés.<br />
<br />
<b>Pathname</b><br />
<br />
Pathname est passé du statut de gem par défaut à celui de classe centrale de Ruby.<br />
<br />
<b>Proc</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Proc</span><span style="color: #808080;">#parameters</span></span> affiche désormais les paramètres optionnels anonymes sous la forme <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">&#91;</span>:opt<span style="color:#006600; font-weight:bold;">&#93;</span></span> au lieu de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">&#91;</span>:opt, <span style="color: #0080ff;">nil</span><span style="color:#006600; font-weight:bold;">&#93;</span></span>, ce qui rend la sortie cohérente avec le cas où le paramètre anonyme est obligatoire.<br />
<br />
<b>Ractor</b><br />
<br />
- La classe <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port</span> a été ajoutée pour un nouveau mécanisme de synchronisation permettant la communication entre les Ractors. <br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Code:</div>
	<hr /><code class="bbcode_code"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td valign="top"><pre style="margin: 0">  port1 = Ractor::Port.<span style="color: #0080ff;">new</span>
  port2 = Ractor::Port.<span style="color: #0080ff;">new</span>
  Ractor.<span style="color: #0080ff;">new</span> port1, port2 <span style="color: #0000ff;">do</span> <span style="color:#006600; font-weight:bold;">|</span>port1, port2<span style="color:#006600; font-weight:bold;">|</span>
    port1 <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color: #cc66cc;">1</span>
    port2 <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color: #cc66cc;">11</span>
    port1 <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color: #cc66cc;">2</span>
    port2 <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color: #cc66cc;">12</span>
  <span style="color: #0000ff;">end</span>
  <span style="color: #cc66cc;">2</span>.<span style="color: #0080ff;">times</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color: #0000ff;">p</span> port1.<span style="color: #0080ff;">receive</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color: #808080;">#=&gt; 1, 2</span>
  <span style="color: #cc66cc;">2</span>.<span style="color: #0080ff;">times</span><span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color: #0000ff;">p</span> port2.<span style="color: #0080ff;">receive</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color: #808080;">#=&gt; 11, 12</span></pre></td></tr></table></code><hr />
</div><br />
<br />
<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port</span> fournit les méthodes suivantes :<br />
<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port<span style="color: #808080;">#receive</span></span>.<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port<span style="color: #808080;">#send</span></span> (ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port<span style="color: #808080;">#&lt;&lt;</span></span>)<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port<span style="color: #808080;">#close</span></span>.<br />
<span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor::Port<span style="color: #808080;">#closed?</span></span>.<br />
<br />
En conséquence, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0000ff;">yield</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#take</span></span> ont été supprimés.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#join</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#value</span></span> ont été ajoutées pour attendre la fin d'un Ractor. Elles sont similaires à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Thread<span style="color: #808080;">#join</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Thread<span style="color: #808080;">#value</span></span>.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#monitor</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#unmonitor</span></span> ont été ajoutées en tant qu'interfaces de bas niveau utilisées en interne pour implémenter <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#join</span></span>.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0000ff;">select</span></span> n'accepte désormais que les Ractors et les Ports. Si des Ractors sont fournis, elle renvoie une valeur lorsqu'un Ractor se termine.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#default_port</span></span> a été ajouté. Chaque <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor</span> dispose d'un port par défaut, qui est utilisé par <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0080ff;">send</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0080ff;">receive</span></span>.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#close_incoming</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor<span style="color: #808080;">#close_outgoing</span></span> ont été supprimés.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0080ff;">shareable_proc</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ractor.<span style="color: #0080ff;">shareable_lambda</span></span> ont été introduits pour rendre Proc ou lambda partageables.<br />
<br />
<b>Range</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Range<span style="color: #808080;">#to_set</span></span> effectue désormais des vérifications de taille afin d'éviter les problèmes liés aux plages infinies.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Range<span style="color: #808080;">#overlap?</span></span> gère désormais correctement les plages infinies (illimitées).<br />
<br />
- Le comportement de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Range<span style="color: #808080;">#max</span></span> sur les plages d'entiers sans début a été corrigé.<br />
<br />
<b>Ruby</b><br />
<br />
Un nouveau module de niveau supérieur <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Ruby</span> a été défini, qui contient des constantes liées à Ruby. Ce module était réservé dans Ruby 3.4 et est désormais officiellement défini.<br />
<br />
<b>Ruby::Box</b><br />
<br />
Une nouvelle fonctionnalité (expérimentale) permettant de séparer les définitions. <br />
<br />
<b>Set</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set</span> est désormais une classe centrale, au lieu d'une classe stdlib chargée automatiquement. <br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set<span style="color: #808080;">#inspect</span></span> utilise désormais un affichage plus simple, similaire aux tableaux littéraux. (Par exemple, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color: #cc66cc;">1</span>, <span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span><span style="color:#006600; font-weight:bold;">&#93;</span></span> au lieu de <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #808080;">#&lt;Set: {1, 2, 3}&gt;</span></span>).<br />
<br />
- Le passage d'arguments à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Set<span style="color: #808080;">#to_set</span></span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Enumerable<span style="color: #808080;">#to_set</span></span> est désormais obsolète.<br />
<br />
<b>Socket</b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Socket.<span style="color: #0080ff;">tcp</span></span> &amp; <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TCPSocket.<span style="color: #0080ff;">new</span></span> acceptent un argument clé <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">open_timeout</span> pour spécifier le délai d'expiration de la connexion initiale.<br />
<br />
- Lorsqu'un délai d'expiration spécifié par l'utilisateur se produisait dans <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TCPSocket.<span style="color: #0080ff;">new</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Errno::ETIMEDOUT</span> ou <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IO::TimeoutError</span> pouvaient auparavant être levés selon la situation. Ce comportement a été unifié afin que <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">IO::TimeoutError</span> soit désormais systématiquement levé. (Veuillez noter que, dans <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Socket.<span style="color: #0080ff;">tcp</span></span>, il existe encore des cas où <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Errno::ETIMEDOUT</span> peut être levé dans des situations similaires, et que dans les deux cas, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Errno::ETIMEDOUT</span> peut être levé lorsque le délai d'expiration se produit au niveau du système d'exploitation.)<br />
<br />
<b>String</b><br />
<br />
- Mise à jour d'Unicode vers la version 17.0.0 et d'Emoji vers la version 17.0. (s'applique également à Regexp)<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">String</span><span style="color: #808080;">#strip</span></span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">strip!</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">lstrip</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">lstrip!</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">rstrip</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">rstrip!</span> sont étendus pour accepter les arguments <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color:#006600; font-weight:bold;">*</span>selectors</span>.<br />
<br />
<b>Thread</b><br />
<br />
Introduction de la prise en charge de l'argument <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Thread<span style="color: #808080;">#raise(cause:)</span></span> similaire à <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Kernel<span style="color: #808080;">#raise</span></span>.<br />
<br />
<br />
<b><font size="3">Améliorations de la mise en œuvre</font></b><br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block"><span style="color: #0000ff;">Class</span><span style="color: #808080;">#new</span></span> (ex. <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Object.<span style="color: #0080ff;">new</span></span>) est plus rapide dans tous les cas, mais surtout lors du passage d'arguments clés. Cela a également été intégré dans YJIT et ZJIT.<br />
<br />
- Les tas GC de pools de tailles différentes grandissent désormais indépendamment, ce qui réduit l'utilisation de la mémoire lorsque seuls certains pools contiennent des objets à longue durée de vie<br />
 <br />
- Le balayage GC est plus rapide sur les pages d'objets volumineux.<br />
<br />
- Les objets « ivar génériques » (String, Array, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">TypedData</span>, etc.) utilisent désormais un nouvel objet interne « fields » pour un accès plus rapide aux variables d'instance.<br />
<br />
- Le GC évite de maintenir une table <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">id2ref</span> interne jusqu'à sa première utilisation, ce qui accélère l'allocation <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">object_id</span> et le balayage GC.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">object_id</span> et <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">hash</span> sont plus rapides sur les objets Class et Module.<br />
<br />
- Les entiers bignum plus grands peuvent rester intégrés à l'aide d'une allocation à largeur variable.<br />
<br />
- <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Random</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Enumerator::Product</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Enumerator::Chain</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">Addrinfo</span>, <span style="font-family: monospace; padding: 2px; background: #ddd; display: inline-block">StringScanner</span> et certains objets internes sont désormais protégés par une barrière d'écriture, ce qui réduit la surcharge du GC.<br />
<br />
<b>Source</b> : <a rel="nofollow" href="https://www.ruby-lang.org/en/news/2025/12/25/ruby-4-0-0-released/" target="_blank">Annonce de Ruby 4.0.0</a><br />
<br />
<b>Et vous ?</b><br />
<br />
:fleche: Pensez-vous que ces améliorations sont crédibles ou pertinentes ?<br />
:fleche: Quel est votre avis sur cette version ?<br />
<br />
<b>Voir aussi :</b><br />
<br />
:fleche: <a href="https://ruby.developpez.com/actu/366161/La-version-3-4-0-de-Ruby-est-desormais-disponible-ajoutant-la-reference-au-parametre-de-bloc-it-le-support-de-Happy-Eyeballs-v2-a-la-bibliotheque-socket-et-rendant-Prism-comme-parseur-par-defaut/" target="_blank">La version 3.4.0 de Ruby est désormais disponible, ajoutant la référence au paramètre de bloc &quot;it&quot;, le support de Happy Eyeballs v2 à la bibliothèque socket et rendant Prism comme parseur par défaut</a><br />
<br />
:fleche: <a href="https://web.developpez.com/actu/373675/Brut-RB-un-nouveau-framework-Web-simple-mais-complet-pour-Ruby-sans-controleurs-verbes-ou-ressources-vous-construisez-simplement-des-pages-des-formulaires-et-des-gestionnaires-d-action-unique/" target="_blank">Brut RB, un nouveau framework Web simple mais complet pour Ruby, sans contrôleurs, verbes ou ressources. Vous construisez simplement des pages, des formulaires et des gestionnaires d'action unique</a></div>

]]></content:encoded>
			<category domain="https://www.developpez.net/forums/f235/autres-langages/autres-langages/ruby/">Ruby</category>
			<dc:creator>Alex</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/d2181168/autres-langages/autres-langages/ruby/version-4-0-0-langage-programmation-ruby-sortie/</guid>
		</item>
	</channel>
</rss>
