<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: hiko1129</title>
    <description>The latest articles on DEV Community by hiko1129 (@hiko1129).</description>
    <link>https://dev.to/hiko1129</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F42802%2Fe6af282d-4150-4572-a8af-326e010d93ee.jpeg</url>
      <title>DEV Community: hiko1129</title>
      <link>https://dev.to/hiko1129</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hiko1129"/>
    <language>en</language>
    <item>
      <title>[Rails][Sorbet] Rubocop Settings</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Sat, 20 Aug 2022 02:24:40 +0000</pubDate>
      <link>https://dev.to/hiko1129/railssorbet-rubocop-settings-hj</link>
      <guid>https://dev.to/hiko1129/railssorbet-rubocop-settings-hj</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660962280/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;下記のようにrubocop-sorbetが入っている前提&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;group&lt;/span&gt; &lt;span class="ss"&gt;:development&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s1"&gt;'rubocop-sorbet'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;require: &lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;下記のようにTrueSigilを有効化してExcludeでspecやconfigを除外するのが良さげ。&lt;br&gt;
デフォルトでFalseSigilが機能しているので全体としてはtyped: falseが必須でアプリケーション本体に関連する部分のみtyped: true以上必須という挙動になる。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;Sorbet/TrueSigil&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;Enabled&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;Include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;**/*.{rb,rbi,rake,ru,jb,jbuilder}"&lt;/span&gt;
  &lt;span class="na"&gt;Exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;spec/**/*&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;config/**/*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;上記設定があると&lt;code&gt;bundle exec srb rbi suggest-typed&lt;/code&gt;でアプリケーション関連のtypedがfalse以下になったときに簡単に気づける。&lt;/p&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>sorbet</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] How to check RBI file update omission with CI</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Thu, 18 Aug 2022 14:04:25 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-how-to-check-rbi-file-update-omission-with-ci-25gh</link>
      <guid>https://dev.to/hiko1129/rubysorbet-how-to-check-rbi-file-update-omission-with-ci-25gh</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660831465/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;tapiocaに関しては--verifyオプションが用意されているのでそれを利用する&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/tapioca gems --verify
bin/tapioca dsl --verify
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;sorbet-railsに関してはtapiocaのようなオプションが用意されていないようなので下記の感じで差分があるか確認する&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bin/rails db:schema:load # ridgepoleを使っている場合にはridgepole --applyを。
bundle exec rake rails_rbi:all
git diff --exit-code --quiet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;実際のところ現状だと各RBIのコンフリクト解消が関わってくるので自分は下記のような感じで対応しています&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;bundle exec srb rbi sorbet-typed
bin/rails db:schema:load
bin/rails rails_rbi:all
bin/tapioca gem --workers=8
bin/tapioca todo
bundle exec srb rbi suggest-typed # コンフリクト解消をここで行ってから差分がでないことを確認する。こうしないとコンフリクト解消前の状態とコンフリクト解消後の状態の比較になってしまい差分が頻繁に発生する状態になってしまいほぼ常にCIで引っかかる状態になってしまう

git diff --exit-code --quiet
if [ $? -ne 0 ]; then
    echo "Please resolve the difference of RBI files"
    exit 1
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;参考:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shopify/tapioca#keeping-rbi-files-for-gems-up-to-date"&gt;https://github.com/Shopify/tapioca#keeping-rbi-files-for-gems-up-to-date&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Shopify/tapioca#keeping-rbi-files-for-dsls-up-to-date"&gt;https://github.com/Shopify/tapioca#keeping-rbi-files-for-dsls-up-to-date&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] What to do when you can't write types in Ruby files (when meta-programming)</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Wed, 17 Aug 2022 08:37:43 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-what-to-do-when-you-cant-write-types-in-ruby-files-when-meta-programming-107n</link>
      <guid>https://dev.to/hiko1129/rubysorbet-what-to-do-when-you-cant-write-types-in-ruby-files-when-meta-programming-107n</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660725463/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;メタプログラミングしている(define_methodとか使っている)ときは.rb上では型を付与できない。&lt;/p&gt;

&lt;p&gt;ex: hoge.rb&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hoge
  define_method :hoge do
    puts 'hogehoge'
  end
end

Hoge.new.hoge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;この場合には、RBIファイルに型を書く対応をする（or &lt;a href="https://github.com/Shopify/tapioca#writing-custom-dsl-compilers"&gt;型生成するコードを書く&lt;/a&gt;）&lt;/p&gt;

&lt;p&gt;ex: hoge.rbi&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# typed: strict

class Hoge
  sig { void }
  def hoge; end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;bin/tapioca gems&lt;/code&gt;などを実行して型が足りないときも同様に&lt;code&gt;sorbet/rbi/shims&lt;/code&gt;以下に型を書く（必要な部分のみで問題ない。）&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# typed: strict

class ActiveRecord::Base
  sig { void }
  def hoge; end # &amp;lt;- こんな感じで必要な差分のみ追記で問題ない
end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ruby</category>
      <category>rails</category>
      <category>sorbet</category>
    </item>
    <item>
      <title>[Rails][Sorbet] How to add kaminari type definitions in sorbet-rails</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Wed, 17 Aug 2022 08:32:23 +0000</pubDate>
      <link>https://dev.to/hiko1129/railssorbet-how-to-add-kaminari-type-definitions-in-sorbet-rails-1ffh</link>
      <guid>https://dev.to/hiko1129/railssorbet-how-to-add-kaminari-type-definitions-in-sorbet-rails-1ffh</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660725143/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;kaminariに限った話ではないが一部のgemに関してはsorbet-railsのinitializerを追加することで型生成対象に含めることができる。&lt;br&gt;&lt;br&gt;
kaminariのgemを入れているから勝手に生成されるとかではなくあくまで自分で設定する必要がある模様。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# -- config/initializers/sorbet_rails.rb&lt;/span&gt;
&lt;span class="no"&gt;SorbetRails&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;configure&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;enabled_gem_plugins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="ss"&gt;:kaminari&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  参考
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/chanzuckerberg/sorbet-rails#enabling-built-in-plugins"&gt;https://github.com/chanzuckerberg/sorbet-rails#enabling-built-in-plugins&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ruby</category>
      <category>rails</category>
      <category>sorbet</category>
    </item>
    <item>
      <title>[Ruby][Sorbet][tapioca] What to do when gem type definition conflicts cannot be resolved</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Wed, 17 Aug 2022 08:22:16 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbettapioca-what-to-do-when-gem-type-definition-conflicts-cannot-be-resolved-2n2c</link>
      <guid>https://dev.to/hiko1129/rubysorbettapioca-what-to-do-when-gem-type-definition-conflicts-cannot-be-resolved-2n2c</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660724536/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  前提
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;tapiocaを使っている&lt;/li&gt;
&lt;li&gt;sorbet-typed(などのコミュニティの型定義)とコンフリクトしている&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bundle exec srb rbi suggest-typed&lt;/code&gt;で解消されない&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  対応
&lt;/h2&gt;

&lt;p&gt;下記のようにtapiocaのconfigのexcludeに対象gemを追加。&lt;/p&gt;

&lt;p&gt;sorbet/tapioca/config.yml&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem:
  exclude:
    - gemA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;試してはいないがおそらくtyped_overridesでfalseにするなどでも解消できるはず（気が向いたら試す）。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gem:
  typed_overrides:
    gemA: "false"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  参考
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shopify/tapioca#excluding-a-gem-from-rbi-generation"&gt;https://github.com/Shopify/tapioca#excluding-a-gem-from-rbi-generation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] Using T.unsafe to escape type constraints</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Tue, 16 Aug 2022 01:52:51 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-escape-using-tunsafe-type-constraints-2ff5</link>
      <guid>https://dev.to/hiko1129/rubysorbet-escape-using-tunsafe-type-constraints-2ff5</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660614771/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;typed: trueでもtyped: strictであってもT.unsafeを使うことで特定部分のみ型に基づかない状態で記述できます。&lt;/p&gt;

&lt;p&gt;自分がよくやる（やるなよって話であるがTODOつけて一旦通すという意味でよくやる）のは下記のパターンです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T.unsafe(self).hoge # selfにhogeメソッドは型定義上存在していないが実際には存在するとき
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;RBIファイルに追記するまで、あるいは何かしらのconfigを書いてメソッドを生やす、あるいは型生成gemのバグ修正待ち、あるいはそもそも事前定義されている型が間違っているときには、上記のようにして一時対応したりしています。&lt;/p&gt;

&lt;h2&gt;
  
  
  参考
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sorbet.org/docs/troubleshooting#escape-hatches"&gt;https://sorbet.org/docs/troubleshooting#escape-hatches&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] What to do when the RBI generated by tapioca does not have the expected type</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Tue, 16 Aug 2022 00:47:44 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-what-to-do-when-the-rbi-generated-by-tapioca-does-not-have-the-expected-type-51m3</link>
      <guid>https://dev.to/hiko1129/rubysorbet-what-to-do-when-the-rbi-generated-by-tapioca-does-not-have-the-expected-type-51m3</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660610864/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sorbet/tapioca/require.rb&lt;/code&gt;を用意していない状態だと、Gemfileでrequire: falseとしているものやGem側がオプショナルなrequireとしているものなどは読み込まれず、RBIファイルには含まれないようです。&lt;br&gt;
&lt;code&gt;sorbet/tapioca/require.rb&lt;/code&gt;に読み込まれていないものを追加することでRBIファイルに型定義(というか雛形)が含まれる模様。&lt;/p&gt;

&lt;p&gt;better_htmlのBetterHtml::Parserの型定義が必要にも関わらずRBIファイルに含まれていない場合には、&lt;code&gt;sorbet/tapioca/require.rb&lt;/code&gt;に下記のように&lt;code&gt;better_html/parser&lt;/code&gt;を追加する必要があります(better_htmlはbetter_html/parserをデフォルトでは&lt;a href="https://github.com/Shopify/better-html/blob/main/lib/better_html.rb"&gt;読み込まない&lt;/a&gt;)。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# typed: strict
# frozen_string_literal: true

require 'better_html/parser'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  参考
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Shopify/tapioca#manually-requiring-parts-of-a-gem"&gt;https://github.com/Shopify/tapioca#manually-requiring-parts-of-a-gem&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] How to make a Rakefile typed</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Mon, 15 Aug 2022 14:22:36 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-how-to-make-a-rakefile-typed-3f01</link>
      <guid>https://dev.to/hiko1129/rubysorbet-how-to-make-a-rakefile-typed-3f01</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660573211/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ruby/rake/blob/master/lib/rake/dsl_definition.rb#L195"&gt;https://github.com/ruby/rake/blob/master/lib/rake/dsl_definition.rb#L195&lt;/a&gt; にて&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;self.extend Rake::DSL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;となっているのでそれを表現した&lt;code&gt;T.all(Rake::DSL, Object)&lt;/code&gt;をselfとする(厳密には正しくない...)。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# typed: true&lt;/span&gt;

&lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;T&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Rake&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;DSL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;# ← selfは実行時エラーになるのでせいぜいObjectっぽい&lt;/span&gt;

&lt;span class="n"&gt;namespace&lt;/span&gt; &lt;span class="ss"&gt;:hoge&lt;/span&gt;
  &lt;span class="n"&gt;task&lt;/span&gt; &lt;span class="ss"&gt;hoge: :environment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] T::Struct == is an identity comparison, not an equivalence comparison</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Sun, 14 Aug 2022 06:22:17 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-tstruct-is-an-identity-comparison-not-an-equivalence-comparison-4go</link>
      <guid>https://dev.to/hiko1129/rubysorbet-tstruct-is-an-identity-comparison-not-an-equivalence-comparison-4go</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660458137/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;T::Structの==は、hashや通常のStructと異なり同値性ではなく同一性比較になっています。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hoge &amp;lt; T::Struct
  const :hoge, Integer
end

a = Hoge.new(hoge: 1)
b = Hoge.new(hoge: 1)

a == b # =&amp;gt; false
a == a # =&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;issue: &lt;a href="https://github.com/sorbet/sorbet/issues/1540"&gt;https://github.com/sorbet/sorbet/issues/1540&lt;/a&gt;&lt;br&gt;
同値性比較用のgem: &lt;a href="https://github.com/bellroy/sorbet-struct-comparable"&gt;https://github.com/bellroy/sorbet-struct-comparable&lt;/a&gt;&lt;/p&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] Use sorbet-coerce to make it easy with type conversion</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Sat, 13 Aug 2022 21:29:05 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-use-sorbet-coerce-to-make-it-easy-with-type-conversion-114c</link>
      <guid>https://dev.to/hiko1129/rubysorbet-use-sorbet-coerce-to-make-it-easy-with-type-conversion-114c</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660426145/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chanzuckerberg/sorbet-coerce"&gt;https://github.com/chanzuckerberg/sorbet-coerce&lt;/a&gt;&lt;br&gt;
単体でのスター数は少ないですが、sorbet-railsがTypedParamsとして提供しているクラスが内部的にsorbet-coerceに依存しているのでsorbet-rails分足して評価して上げても良いような感じです。&lt;/p&gt;

&lt;p&gt;sorbet-coerceは下記のような感じで値を特定の型（クラス）に変換します。&lt;br&gt;&lt;br&gt;
ランタイムレベル変換機能付きのT.castのようなイメージです。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TypeCoerce[T::Boolean].new.from('false') # =&amp;gt; false

class Params &amp;lt; T::Struct
  const :id, Integer
  const :role, String, default: 'wizard'
end

TypeCoerce[Params].new.from({id: '1'}) # =&amp;gt; &amp;lt;Params id=1, role="wizard"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;v0系のバージョン通り絶賛開発中って感じで、T.anyについては制限がある状態です（機能追加のPRは既に出ているので解決は時間の問題の模様）&lt;/p&gt;

&lt;p&gt;Sorbetを利用する場合は、下記のようにTypeCoerce（あるいはsorbet-railsのTypedParams）を利用してjsonをT::Structにdeserializeして、T::Structのserializeメソッドを利用してjson形式（hash形式、as_jsonと同様）にserializeする感じになっていくかと。&lt;/p&gt;

&lt;p&gt;controller上&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class HogeParams &amp;lt; T::Struct
  const :id, Integer
end

class Response &amp;lt; T::Struct
  const :hoge, String
end

typed_params = TypedParams[HogeParams].new.extract!(params) # =&amp;gt; &amp;lt;HogeParams id=1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;jbuilder上&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;T.cast(@res, HogeController::Response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] How to write the type of accessor methods (attr_* series methods)</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Sat, 13 Aug 2022 21:13:37 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-how-to-write-the-type-of-accessor-methods-attr-series-methods-4c39</link>
      <guid>https://dev.to/hiko1129/rubysorbet-how-to-write-the-type-of-accessor-methods-attr-series-methods-4c39</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660425217/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Hoge

  sig {returns(String)} # ← このようにattr_系のメソッドの上にsigを書くだけ
  attr_reader :hoge

end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;メソッドコールに対して型定義できるのでそのうちRSpecのletも定義できるような方法が追加されるかも？&lt;/p&gt;

&lt;h1&gt;
  
  
  参考
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sorbet.org/docs/faq#how-should-i-add-types-to-methods-defined-with-attr_reader"&gt;https://sorbet.org/docs/faq#how-should-i-add-types-to-methods-defined-with-attr_reader&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
    <item>
      <title>[Ruby][Sorbet] Where should I put the RBI I wrote?</title>
      <dc:creator>hiko1129</dc:creator>
      <pubDate>Tue, 09 Aug 2022 16:06:14 +0000</pubDate>
      <link>https://dev.to/hiko1129/rubysorbet-where-should-i-put-the-rbi-i-wrote-19o2</link>
      <guid>https://dev.to/hiko1129/rubysorbet-where-should-i-put-the-rbi-i-wrote-19o2</guid>
      <description>&lt;p&gt;&lt;a href="https://note-hiko1129-com.translate.goog/posts/1660061174/?_x_tr_sl=ja&amp;amp;_x_tr_tl=en&amp;amp;_x_tr_hl=ja&amp;amp;_x_tr_pto=wapp" rel="”noopener"&gt;Translate ja to en&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  結論
&lt;/h2&gt;

&lt;p&gt;sorbet/rbi/shims 以下に置く。&lt;/p&gt;

&lt;p&gt;gemの場合には: sorbet/rbi/shims/gems&lt;br&gt;&lt;br&gt;
(Railsの)appの場合には: sorbet/rbi/shims/app&lt;br&gt;
と言った感じで。&lt;/p&gt;

&lt;h2&gt;
  
  
  根拠
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sorbet.org/docs/rbi#hand-written-rbis-for-gems"&gt;https://sorbet.org/docs/rbi#hand-written-rbis-for-gems&lt;/a&gt; には下記が書かれており、&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When rbi-central does not have RBI files for a gem, tapioca init will still have created some autogenerated RBI files for that gem. These autogenerated files are a great way to start off writing hand-written RBIs for a gem! Simply copy the autogenerated file from the sorbet/rbi/gems/ folder to sorbet/rbi/shims/gems, and start modifying it by hand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/Shopify/tapioca#manually-writing-rbi-definitions-shims"&gt;https://github.com/Shopify/tapioca#manually-writing-rbi-definitions-shims&lt;/a&gt; には下記が書かれている。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A shim is a hand-crafted RBI file that tells Sorbet about constants, ancestors, methods, etc. that it can't understand statically and aren't already generated by Tapioca.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>sorbet</category>
      <category>ruby</category>
      <category>rails</category>
    </item>
  </channel>
</rss>
