<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.3">Jekyll</generator><link href="https://blog.jez.io/feed/sorbet.xml" rel="self" type="application/atom+xml" /><link href="https://blog.jez.io/" rel="alternate" type="text/html" /><updated>2026-01-21T18:17:55-05:00</updated><id>https://blog.jez.io/feed/sorbet.xml</id><title type="html">Jake Zimmerman | Sorbet</title><subtitle>A collection of blog posts about programming, software, types, programming languages, Sorbet, Vim, Markdown, and more.</subtitle><author><name>Jake Zimmerman</name></author><entry><title type="html">Why have lower bounds on generics?</title><link href="https://blog.jez.io/lower-bounds/" rel="alternate" type="text/html" title="Why have lower bounds on generics?" /><published>2025-12-23T15:46:34-05:00</published><updated>2025-12-23T15:46:34-05:00</updated><id>https://blog.jez.io/lower-bounds</id><author><name>Jake Zimmerman</name></author><category term="sorbet" /><category term="ruby" /><category term="plt" /><category term="types" /><summary type="html"><![CDATA[Lower bounds expand the list of ways to create a value of that type. They behave similar to union types in that regard, but they fill a particular niche that only they can fill, relating to subtyping.]]></summary></entry><entry><title type="html">Past, Present, and Future of Sorbet Type Syntax</title><link href="https://blog.jez.io/history-of-sorbet-syntax/" rel="alternate" type="text/html" title="Past, Present, and Future of Sorbet Type Syntax" /><published>2025-04-25T01:57:00-04:00</published><updated>2025-04-25T01:57:00-04:00</updated><id>https://blog.jez.io/history-of-sorbet-syntax</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><category term="plt" /><summary type="html"><![CDATA[A discussion of how Sorbet's type syntax came to be, the problems it solves, and how it could improve.]]></summary></entry><entry><title type="html">Typing instance variables in mixins</title><link href="https://blog.jez.io/ivars-in-mixins/" rel="alternate" type="text/html" title="Typing instance variables in mixins" /><published>2025-04-14T17:09:03-04:00</published><updated>2025-04-14T17:09:03-04:00</updated><id>https://blog.jez.io/ivars-in-mixins</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><summary type="html"><![CDATA[Sorbet does not (yet?) have "abstract instance variables" for use inside abstract modules, but abstract methods are a close approximation.]]></summary></entry><entry><title type="html">Generic methods cannot have non-generic defaults in Sorbet</title><link href="https://blog.jez.io/generic-method-default/" rel="alternate" type="text/html" title="Generic methods cannot have non-generic defaults in Sorbet" /><published>2024-07-28T13:47:45-04:00</published><updated>2024-07-28T13:47:45-04:00</updated><id>https://blog.jez.io/generic-method-default</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><summary type="html"><![CDATA[Sorbet does not allow generic methods to have non-generic default arguments. The best alternative is to split the method into two methods, with one implemented by calling the other with the default value.]]></summary></entry><entry><title type="html">A trick for invariant generics in Sorbet</title><link href="https://blog.jez.io/invariant-type-member-trick/" rel="alternate" type="text/html" title="A trick for invariant generics in Sorbet" /><published>2024-06-05T20:28:55-04:00</published><updated>2024-06-05T20:28:55-04:00</updated><id>https://blog.jez.io/invariant-type-member-trick</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><summary type="html"><![CDATA[There's a neat trick for using generic methods to get around some of the limitations that invariant type members in generic classes carry.]]></summary></entry><entry><title type="html">Abstract singleton class methods are an abomination</title><link href="https://blog.jez.io/abstract-singleton-methods/" rel="alternate" type="text/html" title="Abstract singleton class methods are an abomination" /><published>2024-01-01T19:25:23-05:00</published><updated>2024-01-01T19:25:23-05:00</updated><id>https://blog.jez.io/abstract-singleton-methods</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><summary type="html"><![CDATA[Abstract singleton class methods do not belong in a well-behaved type system. Sorbet allows them anyways, which causes problems. Here's why they're bad and what to do instead.]]></summary></entry><entry><title type="html">Why don’t constructors have override checking?</title><link href="https://blog.jez.io/constructor-override-checking/" rel="alternate" type="text/html" title="Why don’t constructors have override checking?" /><published>2023-12-31T00:14:09-05:00</published><updated>2023-12-31T00:14:09-05:00</updated><id>https://blog.jez.io/constructor-override-checking</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><summary type="html"><![CDATA[A discussion of how constructors in typical typed object-oriented languages get away with not having to solve a problem that plagues Sorbet.]]></summary></entry><entry><title type="html">Inheritance in Ruby, in pictures</title><link href="https://blog.jez.io/inheritance-in-ruby/" rel="alternate" type="text/html" title="Inheritance in Ruby, in pictures" /><published>2023-12-28T15:31:20-05:00</published><updated>2023-12-28T15:31:20-05:00</updated><id>https://blog.jez.io/inheritance-in-ruby</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><category term="types" /><category term="in-pictures" /><summary type="html"><![CDATA[A solid grasp of the tools Ruby provides for inheritance, like include and extend, helps write better code. But the concepts are often learned hastily—this post revisits them in depth.]]></summary></entry><entry><title type="html">A trick for generic constructors in Sorbet</title><link href="https://blog.jez.io/generic-constructor-trick/" rel="alternate" type="text/html" title="A trick for generic constructors in Sorbet" /><published>2023-10-28T16:09:02-04:00</published><updated>2023-10-28T16:09:02-04:00</updated><id>https://blog.jez.io/generic-constructor-trick</id><author><name>Jake Zimmerman</name></author><category term="ruby" /><category term="sorbet" /><summary type="html"><![CDATA[There's a bit of a clever trick with T.all and T.attached_class that allows Sorbet to infer better types for constructors of generic classes.]]></summary></entry><entry><title type="html">Only return nil if given nil</title><link href="https://blog.jez.io/sorbet-nil-if-nil/" rel="alternate" type="text/html" title="Only return nil if given nil" /><published>2023-09-15T18:28:50-04:00</published><updated>2023-09-15T18:28:50-04:00</updated><id>https://blog.jez.io/sorbet-nil-if-nil</id><author><name>Jake Zimmerman</name></author><category term="sorbet" /><category term="ruby" /><summary type="html"><![CDATA[A quick post showing how to write a type that people commonly want to be able to write, where the return type is only nil if the input was nilable.]]></summary></entry></feed>