Skip to content

Instantly share code, notes, and snippets.

View njonsson's full-sized avatar
🤝
Working @amzn but open to new opportunities

Nils Jonsson njonsson

🤝
Working @amzn but open to new opportunities
View GitHub Profile
@njonsson
njonsson / specifying-default-values-with-rubys-module-attr-reader-and-attr-accessor.md
Last active May 29, 2021 12:33
Specifying default values with Ruby’s Module#attr_reader and #attr_accessor

[This is [a DZone Snippet I created in August 2007][dzone-snippet]. DZone Snippets is now a defunct site, so I’m reposting it here.]

Dependency injection in Ruby is as easy as falling off a log. As [Jamis Buck has pointed out][jamis-buck-net-ssh-revisited], DI is a good thing, but DI frameworks for Ruby are overkill. The language makes them unnecessary.

Here's how to enhance [Module#attr_reader][ruby-module-attr-reader] and [#attr_accessor][ruby-module-attr-accessor] so that they can receive an options hash for specifying the default value of an attribute.

module AttrWithDefaultExtension
  
  module ClassMethods

Keybase proof

I hereby claim:

  • I am njonsson on github.
  • I am njonsson (https://keybase.io/njonsson) on keybase.
  • I have a public key whose fingerprint is 546E EA0C B2D1 AFC7 D08B B11C 27D3 E4D0 BF33 68B4

To claim this, I am signing this object:

using System;
using System.Diagnostics;
/// <summary>
/// Serves as a wrapper around objects that require disposal but that do not
/// implement <see cref="System.IDisposable"/>.
/// </summary>
/// <typeparam name="T">The type of <see cref="Object"/></typeparam>
public abstract class DisposerBase<T> : IDisposable
{
// (Do this up front somewhere else.)
var closeMethod = typeof(OpenNETCF.Phone.Sim.Sim).GetMethod("Close");
// (Do this many times.)
using (var disposer = new Disposer<OpenNETCF.Phone.Sim.Sim>(OpenNETCF.Phone.Sim.Sim(), closeMethod))
{
// Use the 'disposer.Object' property ...
}
using (var disposer = new Disposer<OpenNETCF.Phone.Sim.Sim>(new OpenNETCF.Phone.Sim.Sim(), "Close"))
{
// Use the 'disposer.Object' property ...
}
var sim = new OpenNETCF.Phone.Sim.Sim();
try
{
// Use the 'sim' variable ...
}
finally
{
sim.Close();
}
// Unfortunately, this isn't possible.
using (var sim = new OpenNETCF.Phone.Sim.Sim())
{
// Use the 'sim' variable ...
}
@njonsson
njonsson / git-rebase-tags.rb
Created April 7, 2011 18:29
UPDATE: Use the `--tag-name-filter` option of `git-filter-branch`. http://blog.nilsjonsson.com/post/4421450571/rebasing-tags-in-git-repositories
#! /usr/bin/env ruby
def pluralize(word, count=2, plural_word=nil)
plural_word ||= "#{word}s"
"#{count} #{(count == 1) ? word : plural_word}"
end
unless (ARGV.length == 1) &&
(good_revision = system("git log -1 #{ARGV.first} 2>/dev/null"))
puts "Unknown revision '#{ARGV.first}'" unless good_revision
source 'http://rubygems.org'
gem 'rake'
group :development do
gem 'autotest'
gem 'autotest-fsevent'
gem 'ruby-debug'
end
require 'sinatra'
get '/all-good' do
[200, [['Set-Cookie', 'foo=bar; baz']], 'Hello World!']
end
get '/huh' do
[404, 'What?']
end